razón para exec en scripts de envoltura

27

He visto ejemplos de scripts de envoltura que, en pocas palabras, son los siguientes:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

exec "$myprog" "$@"

Como se ve arriba, usan execpara reemplazar el shell recién creado casi inmediatamente con el $myprog. Se podría lograr lo mismo sin exec:

#!/bin/bash

myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""

"$myprog" "$@"

En este último ejemplo, se inicia una nueva instancia de bash y luego $myprogse inicia como un proceso secundario de la instancia de bash.

¿Cuáles son los beneficios del primer enfoque?

Martín
fuente

Respuestas:

31

El uso exechace que el contenedor sea más transparente, es decir, hace que sea menos probable que el usuario o la aplicación que llama al script necesite tener en cuenta que se trata de un relé que a su vez inicia el programa "real".

En particular, si la persona que llama quiere matar el programa, simplemente matará el proceso que acaba de iniciar. Si la secuencia de comandos del reiniciador ejecuta un proceso secundario, la persona que llama necesitaría saber que debería averiguar el elemento secundario del reiniciador y eliminarlo. El script de envoltura podría establecer una trampa para transmitir algunas señales, pero eso no funcionaría con SIGSTOP o SIGKILL, que no se puede atrapar.

Las llamadas exectambién ahorran un poco de memoria (y otros recursos como PID, etc.) ya que no es necesario mantener un shell adicional sin nada que hacer.

Si hay varios contenedores, los problemas se suman (dificultad para encontrar el proceso correcto para matar, sobrecarga de memoria, etc.).

Algunos shells (por ejemplo, el shell de Korn) detectan automáticamente cuándo un comando es el último y no hay una trampa activa y ponen una implícita exec, pero no todos lo hacen (por ejemplo, no bash).

Gilles 'SO- deja de ser malvado'
fuente
10

Al no encontrar duplicados ... consulte el manual de FreeBSD , que brinda una razón suficiente:

La execdeclaración reemplaza el proceso de shell con el programa especificado. Si execse omite, el proceso de shell permanece en la memoria mientras se ejecuta el programa y consume innecesariamente los recursos del sistema.

que es esencialmente la razón que me explicó hace bastante tiempo (por uno de los porteros), y es bastante conocida.

Thomas Dickey
fuente