Зачем использовать `bash -c` в супервизоре вместо прямого вызова скрипта?

11

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

Просто из любопытства я заметил, что большинство команд в supervisord, похоже, называются так:

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

Я читал человека из bash и знаю, что -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 с параметром user = stanza в конфигурации.

Чтобы обойти эту проблему bash -cможно использовать.

Марк Вагнер
источник
2
Марк, спасибо за ваш ответ, но я думаю, что другой был более правдоподобным сценарием (хотя ваш вариант не является неправильным для меня, мне все еще нужно выбрать один правильный ответ ..). Кроме того, я также помогаю новому пользователю с меньшим количеством очков.
Даниэль Коста