¿Por qué usar `bash -c` en el supervisor en lugar de llamar al script directamente?

11

Estoy empezando a usar supervisordpara controlar los servicios en mi servidor. No soy un usuario profesional de Linux, pero puedo manejarlo bastante bien y hacerlo funcionar.

Solo por curiosidad, he notado que la mayoría de los comandos en supervisión parecen llamarse así:

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

He leído el hombre de bash, y sé que -cdebería usarse para insertar variables pasadas después de la cadena.

Entonces, ¿cuál es el punto de usar bash -cen supervisor (o en cualquier otro lugar) en lugar de llamar al script directamente (como el ejemplo a continuación), considerando que no se pasaron / usaron variables?

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

¡Gracias!

Daniel Costa
fuente

Respuestas:

11

Shell presenta como la expansión de nombre de ruta ( *, ?), listas de comandos ( ;, &&, ||), redirección ( <, >, |,) no son implementadas por supervisord que sólo divide el comando en una matriz de cadenas de argumentos.

El bash -cpuede ser sólo una ayuda para el usuario novato que podría estar tentado a usar tales características en el comando. Por ejemplo, evita la sorpresa de que

command=echo foo > /tmp/bar

salidas en foo > /tmp/barlugar de escribir fooen /tmp/bar.

-ctiene poco que ver con las variables. Ningún argumento adicional a la fiesta solamente estarían disponibles como argumentos del script $0, $1etc. en el comando, pero esa característica rara vez tiene ningún uso. Por ejemplo bash -c 'echo $0 $0' foosalidas foo foo.

Marko Kohtala
fuente
1
Gracias, esa fue una respuesta muy pragmática, y eso probablemente me ahorrará mucho tiempo. Yo, como usuario novato, cometería este error (¡y nunca pienso en bash -cuna solución!).
Daniel Costa
6

Se explica en la documentación :

El supervisor no ejecuta ningún shell cuando ejecuta un subproceso, por lo que las variables de entorno como USER, PATH, HOME, SHELL, LOGNAME, etc. no cambian de sus valores predeterminados ni se reasignan. Esto es particularmente importante de tener en cuenta cuando ejecuta un programa desde un supervisor ejecutado como root con un usuario = stanza en la configuración.

Para solucionar este problema, bash -cse puede utilizar.

Mark Wagner
fuente
2
Mark, gracias por tu respuesta, pero creo que el otro fue un escenario más plausible (aunque el tuyo no es incorrecto para mí, todavía necesito elegir una respuesta correcta ...). Además de eso, también estoy ayudando al nuevo usuario con menos puntos.
Daniel Costa