Pourquoi utiliser `bash -c` dans le superviseur au lieu d'appeler directement le script?

11

Je commence à utiliser supervisordpour contrôler les services sur mon serveur. Je ne suis pas un utilisateur pro de Linux, mais je peux très bien le faire fonctionner.

Juste par curiosité, j'ai remarqué que la plupart des commandes dans supervisord semblent s'appeler comme:

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

J'ai lu l'homme de bash, et je sais que cela -cdevrait être utilisé pour insérer des variables passées après la chaîne.

Quel est donc l'intérêt d'utiliser bash -cdans le superviseur (ou tout autre endroit) au lieu d'appeler le script directement (comme l'exemple ci-dessous), étant donné qu'aucune variable n'est passée / utilisée?

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

Merci!

Daniel Costa
la source

Réponses:

11

Shell des caractéristiques telles que le développement des chemins ( *, ?), des listes de commandes ( ;, &&, ||), redirection ( <, >, |,) ne sont pas mises en œuvre par supervisord qui sépare uniquement la commande dans un tableau de chaînes d'argument.

Le bash -cpeut être juste une aide pour les utilisateurs novices qui pourraient être tentés d'utiliser de telles fonctionnalités dans la commande. Par exemple, cela évite la surprise que

command=echo foo > /tmp/bar

sorties au foo > /tmp/barlieu d'écrire fooà /tmp/bar.

-ca peu à voir avec les variables. Tous les autres arguments à la bash ne seront disponibles que les arguments de script $0, $1etc. dans la commande, mais cette fonctionnalité a rarement toute utilisation. Par exemple, les bash -c 'echo $0 $0' foosorties foo foo.

Marko Kohtala
la source
1
Merci, c'était une réponse très pragmatique, et cela me fera probablement gagner beaucoup de temps. En tant qu'utilisateur novice, je commettrais cette erreur (et je ne penserais jamais à bash -cune solution!).
Daniel Costa
6

Il est expliqué dans la documentation :

Aucun shell n'est exécuté par supervisord lorsqu'il exécute un sous-processus, de sorte que les variables d'environnement telles que USER, PATH, HOME, SHELL, LOGNAME, etc. ne sont pas modifiées par rapport à leurs valeurs par défaut ni autrement réaffectées. Ceci est particulièrement important à noter lorsque vous exécutez un programme à partir d'un supervord exécuté en tant que root avec une strophe user = dans la configuration.

Pour contourner ce problème, bash -cvous pouvez utiliser.

Mark Wagner
la source
2
Mark, merci pour ta réponse mais je pense que l'autre était un scénario plus plausible (alors que la tienne n'est pas incorrecte pour moi, j'ai encore besoin de choisir une bonne réponse ..). En plus de cela, j'aide également le nouvel utilisateur avec moins de points.
Daniel Costa