Я начинаю использовать 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
может быть использовано.