Я начинаю использовать 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= stanza в конфигурации.
Для обойти эту проблему можно использовать bash -c
.