Por que usar 'bash -c' no supervisor ao invés de chamar o script diretamente?

7

Estou começando a usar supervisord para controlar os serviços no meu servidor. Eu não sou um usuário pro do Linux, mas posso usá-lo muito bem e colocá-lo em funcionamento.

Só por curiosidade, notei que a maioria dos comandos no supervisord parecem ser chamados assim:

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

Eu li o homem de bash, e sei que -c deve ser usado para inserir variáveis passadas depois da string.

Então, qual é o ponto em usar bash -c no supervisor (ou em qualquer outro lugar) ao invés de chamar o script diretamente (como exemplo abaixo), considerando que nenhuma variável foi passada / usada?

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

Obrigado!

    
por Daniel Costa 14.09.2015 / 23:33

2 respostas

9

Recursos do shell, como expansão do nome do caminho ( * , ? ), listas de comandos ( ; , && , || ), redirecionamento ( < , > , | ,) não são implementados pelo supervisord que apenas divide o comando em um array de strings de argumentos.

O bash -c pode ser apenas uma ajuda para usuários novatos que podem ser tentados a usar tais recursos no comando. Por exemplo, evita a surpresa que

command=echo foo > /tmp/bar

envia foo > /tmp/bar em vez de escrever foo para /tmp/bar .

-c tem pouco a ver com variáveis. Quaisquer argumentos adicionais para o bash só estarão disponíveis como argumentos de script $0 , $1 , etc. no comando, mas esse recurso raramente tem uso. Por exemplo, bash -c 'echo $0 $0' foo outputs foo foo .

    
por 15.09.2015 / 21:49
5

É explicado na documentação :

No shell is executed by supervisord when it runs a subprocess, so environment variables such as USER, PATH, HOME, SHELL, LOGNAME, etc. are not changed from their defaults or otherwise reassigned. This is particularly important to note when you are running a program from a supervisord run as root with a user= stanza in the configuration.

Para contornar este problema bash -c pode ser usado.

    
por 15.09.2015 / 00:30