Назад | Перейти на главную страницу

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

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

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

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

Я читал человека Баша и знаю, что -c следует использовать для вставки переменных, переданных после строки.

Итак, в чем смысл использования bash -c в супервизоре (или в любом другом месте) вместо прямого вызова скрипта (как в примере ниже), учитывая, что никакие переменные не были переданы / использованы?

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

Спасибо!

Возможности оболочки, такие как расширение имени пути (*, ?), списки команд (;, &&, ||), перенаправление (<, >, |,) не реализуются супервизором, который только разбивает команду на массив строк аргументов.

В bash -c может быть просто подспорьем для начинающего пользователя, у которого может возникнуть соблазн использовать такие функции в команде. Например, он избегает удивления, что

command=echo foo > /tmp/bar

выходы foo > /tmp/bar вместо того, чтобы писать foo к /tmp/bar.

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

Это объясняется в документации:

Никакая оболочка не выполняется супервизором, когда он запускает подпроцесс, поэтому переменные среды, такие как USER, PATH, HOME, SHELL, LOGNAME и т. Д., Не изменяются по сравнению с их значениями по умолчанию или иным образом переназначаются. Это особенно важно отметить, когда вы запускаете программу из супервизора, запущенного от имени root, с разделом user = в конфигурации.

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