Después de de nuestra extensa compilación de datos dimos con la solución esta contratiempo que presentan algunos los usuarios. Te brindamos la respuesta y deseamos que te resulte de mucha ayuda.
Solución:
los "[email protected]"
bit se expandirá a la lista de parámetros posicionales (generalmente los argumentos de la línea de comando), citados individualmente para evitar la división de palabras y la generación de nombres de archivo (“globbing”).
los exec
reemplazará el proceso actual con el proceso resultante de ejecutar su argumento.
En breve, exec "[email protected]"
ejecutará el comando dado por los parámetros de la línea de comando de tal manera que el proceso actual sea reemplazado por él (si el exec
es capaz de ejecutar el comando).
Otras dos respuestas explican qué exec "[email protected]"
lo hace. Esta respuesta en Stack Overflow explica por qué es importante para Docker y, como supones, tiene que ver con las señales:
Esto es importante en Docker para que las señales se transmitan correctamente. Por ejemplo, si Redis se inició sin
exec
no recibirá unSIGTERM
aldocker stop
y no tendrá la oportunidad de apagarse limpiamente. En algunos casos, esto puede provocar la pérdida de datos o procesos zombis.Si inicia procesos secundarios (es decir, no utiliza
exec
), el proceso principal se vuelve responsable de manejar y reenviar señales según corresponda. Esta es una de las razones por las que es mejor usarsupervisord
o similar cuando se ejecutan múltiples procesos en un contenedor, ya que reenviará las señales de manera adecuada.
"[email protected]"
en shells tipo Bourne, en contextos de lista se expande a todos los parámetros posicionales como argumentos separados.
En un script, inicialmente, los parámetros posicionales son los argumentos que recibió el propio script.
exec
es ejecutar un comando en el mismo proceso que el shell. Ese es el último comando que ejecutará un script porque después de eso, el proceso ejecutará otro comando además del shell.
Entonces, si su guión es
#! /bin/sh -
exec "[email protected]"
Y llamas a tu script usando una línea de comando de shell como:
/path/to/your-script 'echo' "some test" 'x y'
llamará exec
con echo
, some test
y x y
como argumentos que se ejecutarán echo
(en la mayoría sh
implementaciones, /bin/echo
a diferencia de la echo
shell incorporado) en el mismo proceso que anteriormente estaba ejecutando el shell interpretando su secuencia de comandos con some test
y x y
como argumentos.