Por que usar `bash -c` no supervisor em vez de chamar o script diretamente?

11

Estou começando a usar supervisordpara controlar serviços no meu servidor. Eu não sou um usuário profissional do linux, mas posso usá-lo muito bem e executá-lo.

Por curiosidade, notei que a maioria dos comandos no supervisord parece ser chamada como:

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

Eu li o homem do bash e sei que -cdeve ser usado para inserir variáveis ​​passadas após a string.

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

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

Obrigado!

Daniel Costa
fonte

Respostas:

11

Shell apresenta como expansão de nome ( *, ?), listas de comandos ( ;, &&, ||), redirecionamento ( <, >, |,) não são implementadas por supervisord que só divide o comando em uma matriz de strings argumentos.

O bash -cpode ser apenas uma ajuda para usuário iniciante que poderiam ser tentados a usar esses recursos no comando. Por exemplo, evita a surpresa de que

command=echo foo > /tmp/bar

saídas em foo > /tmp/barvez de escrever foopara /tmp/bar.

-ctem pouco a ver com variáveis. Quaisquer argumentos adicionais para a festa só estaria disponível como argumentos de script $0, $1etc. no comando, mas esse recurso tem raramente qualquer uso. Por exemplo bash -c 'echo $0 $0' foosaídas foo foo.

Marko Kohtala
fonte
1
Obrigado, essa foi uma resposta muito pragmática e provavelmente economizará muito tempo. Eu, como usuário iniciante, cometeria esse erro (e nunca pensaria em bash -cuma solução!).
Daniel Costa
6

É explicado na documentação :

Nenhum shell é executado pela supervisord quando ele executa um subprocesso; portanto, variáveis ​​de ambiente como USER, PATH, HOME, SHELL, LOGNAME etc. não são alteradas de seus padrões ou, de outra forma, são reatribuídas. Isso é particularmente importante para observar quando você está executando um programa a partir de uma autoridade de supervisão executada como root com uma estrofe de usuário = na configuração.

Para contornar esse problema, bash -cpode ser usado.

Mark Wagner
fonte
2
Mark, obrigado por sua resposta, mas acho que o outro era um cenário mais plausível (enquanto o seu não está incorreto para mim, ainda preciso escolher uma resposta certa ..). Além disso, também estou ajudando o novo usuário com menos pontos.
Daniel Costa