Навіщо використовувати `bash -c` в супервізорі, а не викликати скрипт безпосередньо?


11

Я починаю використовувати supervisordдля управління службами на своєму сервері. Я не є професійним користувачем Linux, але можу отримати його досить добре і запустити його.

Щойно з цікавості я помітив, що більшість команд під наглядом здається так:

[program:install]
command=bash -c "/src/etc/install.sh"

Я читав башеву людину і знаю, що її -cслід використовувати для вставки змінних, переданих після рядка.

Тож який сенс використовувати bash -cв супервізорі (або будь-якому іншому місці), а не викликати скрипт безпосередньо (наприклад, приклад нижче), враховуючи, що немає змінних, де передано / використовується?

[program:install]
command=/src/etc/install.sh

Дякую!

Відповіді:


11

Shell функції , такі як розширення імен файлів ( *, ?), списки команд ( ;, &&, ||), перенаправленням ( <, >, |,) не реалізується supervisord , що тільки розбиває команду на масив аргументів рядків.

bash -cМоже бути тільки допомога для користувача новачка , який може виникнути спокуса використовувати такі функції в команді. Наприклад, це дозволяє уникнути сюрпризу

command=echo foo > /tmp/bar

виводить foo > /tmp/barзамість запису fooв /tmp/bar.

-cмає мало спільного зі змінними. Будь-які додаткові аргументи Баша будуть доступні тільки в якості аргументів сценарію $0, $1і т.д. в команді, але ця функція має рідко будь-яке використання. Наприклад, bash -c 'echo $0 $0' fooвиходи foo foo.


1
Дякую, це була дуже прагматична відповідь, і це, ймовірно, заощадить мені багато часу. Я, як початківець користувач, зробив би цю помилку (і ніколи не замислювався bash -cяк про рішення!).
Даніель Коста

6

Це пояснюється в документації :

Жодна оболонка не виконується наглядною системою, коли вона виконує підпроцес, тому змінні середовища, такі як USER, PATH, HOME, SHELL, LOGNAME тощо, не змінюються зі своїх стандартних налаштувань і не призначаються іншим чином. Це особливо важливо відзначити, коли ви запускаєте програму з нагляду запускається як root з користувачем = строфа в конфігурації.

Щоб обійти цю проблему, bash -cможна використовувати.


2
Марк, дякую за вашу відповідь, але я думаю, що інший був більш правдоподібним сценарієм (хоча ваш не є для мене неправильним, мені все одно потрібно вибрати одну правильну відповідь ..). Крім того, я також допомагаю новому користувачеві з меншою кількістю очок.
Даніель Коста
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.