Sé que, nohup
al ser binario, se puede acceder a él desde cualquier shell. Pero el exec
integrado probablemente exista en todos los shells.
¿Hay alguna razón para preferir uno de ellos al otro?
Respuesta1
¿Qué es mejor, un pez o una bicicleta? nohup
y exec
hacer cosas diferentes.
exec
reemplaza el shell con otro programa. Usarlo exec
en un trabajo en segundo plano simple no es útil: exec myprogram; more stuff
reemplaza el shell con myprogram
y por lo tanto no se ejecuta more stuff
, a diferencia de myprogram; more stuff
cuál se ejecuta more stuff
cuando myprogram
finaliza; pero exec myprogram & more stuff
comienza myprogram
en segundo plano y luego se ejecuta more stuff
, tal como myprogram & more stuff
.
nohup
ejecuta el programa específico con la señal SIGHUP ignorada. Cuando se cierra una terminal, el kernel envía SIGHUP al proceso de control en esa terminal (es decir, el shell). El shell, a su vez, envía SIGHUP a todos los trabajos que se ejecutan en segundo plano. Ejecutar un trabajo con nohup
evita que se elimine de esta manera si el terminal muere (lo que sucede, por ejemplo, si inició sesión de forma remota y la conexión se interrumpe, o si cierra el emulador de terminal).
nohup
también redirige la salida del programa al archivo nohup.out
. Esto evita que el programa muera porque no puede escribir en su salida o en su salida de error. Tenga en cuenta que nohup
no redirige la entrada. Para desconectar completamente un programa del terminal donde lo inició, use
nohup myprogram </dev/null >myprogram.log 2>&1 &
Respuesta2
exec &
=> ejecuta un proceso como proceso en segundo plano para que pueda continuar usando el mismo terminal para otros trabajos.
nohup
=> evita todos los SIGHUP (señal de terminación) y continúa la ejecución incluso si su terminal está cerrado.
exec
El proceso muere cuando SIGHUP
se recibe a, pero nohup
el proceso continúa.
Respuesta3
El comando integrado del shell exec <command>
reemplaza el shell con <command>
, no se crea ningún proceso nuevo ni se crea ningún PID nuevo. Después de completar <command>
normalmente su terminal se cerrará. Al ejecutarlo en segundo plano, primero se crea un subshell, que luego se reemplaza inmediatamente por <command>
.
El nohup <command>
comando se ejecutará <command>
pero será inmune a los bloqueos (kill -s 1), por lo que no finalizará cuando se cierre el shell, la terminal desde la que se inició. Al ejecutarlo en segundo plano, primero se crea un subshell y el comando se ejecuta en segundo plano, devolviéndole al indicador.
Sin embargo, en las secuencias de comandos, el efecto inmediato es más o menos el mismo: <command>
su secuencia de comandos lo inicia y la secuencia de comandos continuará sin esperar <command>
a comenzar, enviar resultados o completarse.
Respuesta4
No se puede comparar nohup
con exec
. Cuando ejecuta un ejecutable con nohup
, el proceso no se finalizará cuando cierre la sesión (sesión ssh); normalmente nohup
se utiliza para nice
ejecutar procesos con una prioridad más baja. La HUP
señal es, por convención, la forma en que un terminal advierte a los procesos dependientes del cierre de sesión.