¿Por qué usar "nohup &" en lugar de "exec &"

67

Sé que, al nohupser un binario, se puede acceder desde cualquier shell. Pero el execincorporado probablemente existe en cada shell.

¿Hay alguna razón para preferir uno de ellos, al otro?

loxaxs
fuente

Respuestas:

113

¿Qué es mejor, un pez o una bicicleta? nohupy exechacer cosas diferentes.

execreemplaza el shell con otro programa. El uso execen un trabajo en segundo plano simple no es útil: exec myprogram; more stuffreemplaza el shell con myprogramy no se ejecuta more stuff, a diferencia de lo myprogram; more stuffque se ejecuta more stuffcuando myprogramtermina; pero exec myprogram & more stuffcomienza myprogramen segundo plano y luego se ejecuta more stuff, al igual que myprogram & more stuff.

nohupejecuta el programa específico con la señal SIGHUP ignorada. Cuando se cierra un terminal, el núcleo envía SIGHUP al proceso de control en ese 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 nohupevita que se elimine de esta manera si el terminal muere (lo que ocurre, por ejemplo, si inició sesión de forma remota y la conexión se cae, o si cierra el emulador de terminal).

nohupTambién redirige la salida del programa al archivo nohup.out. Esto evita que el programa muera porque no puede escribir en su salida o salida de error. Tenga en cuenta que nohupno redirige la entrada. Para desconectar completamente un programa del terminal donde lo inició, use

nohup myprogram </dev/null >myprogram.log 2>&1 &
Gilles 'SO- deja de ser malvado'
fuente
27
una bicicleta> un pez
Chris Jaynes
66
Siento disentir. El pescado es obviamente un método superior de transporte si se puede implementar.
ESTE USUARIO NECESITA AYUDA el
66
@THISUSERNEEDSHELP Pero una bicicleta es mejor comida, ¿no?
Gilles 'SO- deja de ser malvado'
3
@GypsyCosmonaut Después de correr exec firefox, el shell ya no se ejecuta: ha sido reemplazado por firefox. Puede pensar execen combinar la salida de un programa y comenzar uno nuevo, pero manteniendo la misma ID de proceso. El terminal sigue funcionando porque nada le dijo que se detuviera. Cuando más tarde salga de Firefox, el firefoxproceso finaliza. El terminal se da cuenta de que su proceso hijo ha salido y, por lo tanto, sale a su vez.
Gilles 'SO- deja de ser malvado'
55
Dale un pescado a un hombre y lo alimentarás por un día. Dale una bicicleta a un hombre y podrá llevarla al supermercado y comprar pescado para toda la vida.
David
18

exec & => ejecuta un proceso como proceso en segundo plano, por lo que puede continuar utilizando el mismo terminal para otros trabajos.

nohup => evita todo SIGHUP (señal de terminación) y continúa la ejecución incluso si su terminal está cerrada.

execel proceso muere cuando SIGHUPse recibe un, pero el nohupproceso continúa.

Ani Menon
fuente
1
Esta respuesta parece ser correcta. Como dicen otras respuestas anteriores, normalmente execreemplaza el proceso en ejecución, pero eso no parece suceder cuando usas &en segundo plano el comando ejecutado. Ni en bash ni zsh.
Dan Pritts
@DanPritts ¿Qué quieres decir con que no sucede? Se inicia un subproceso en segundo plano y luego se reemplaza, por lo que exec smth &es lo mismo que (exec smth) &, ¿no es eso lo que está sucediendo?
phk 01 de
1
Quiero decir que no se ejecuta en el sentido en que normalmente pensarías (reemplazando el shell actual), solo se ejecuta como un proceso en segundo plano. Supongo que probablemente sea lo mismo que (exec smth) &. Pero no esperaría que fuera lo mismo: esperaría que fuera un error de sintaxis, ¿cómo puede ejecutar un proceso (reemplazarse a sí mismo) y luego ejecutar el proceso ejecutado? Ya no estás allí para hacerlo.
Dan Pritts
2

El comando shell incorporado exec <command>reemplaza el shell con <command>, sin proceso nuevo, no se crea ningún PID nuevo. Después de completar <command>normalmente su terminal se cerrará. Al ejecutarlo en segundo plano, primero se crea una subshell, que luego se reemplaza de manera similar por <command>.

El nohup <command> comando se ejecutará <command>pero se impondrá a los bloqueos (kill -s 1), por lo que no finalizará cuando se cierre el shell, el terminal desde el que se inició. Al ejecutarlo en segundo plano, primero se crea una subshell y el comando se ejecuta en segundo plano, volviendo a la solicitud.

Sin embargo, en la secuencia de comandos, el efecto inmediato es más o menos el mismo, <command>lo inicia su secuencia de comandos y la secuencia de comandos continuará sin esperar a <command>que comience, envíe la salida o se complete.

HBruijn
fuente
Yo tampoco estoy seguro de lo que hace el ejecutivo. Quiero decir ... entiendo lo que se supone que debe hacer, pero solo puedo ver una pequeña diferencia entre hacer script.sh &o exec script.sh &. En ambos casos, el comando se ejecuta en un proceso secundario, no reemplaza el proceso de llamada, consulte: paste.alacon.org/44474 (demasiado tiempo para copiarlo aquí en un comentario ...). ¿Qué estoy haciendo mal?
Stéphane
2

No se puede comparar nohupcon exec. Cuando ejecuta un ejecutable con nohup, el proceso no se anulará cuando cierre la sesión (sesión ssh); generalmente nohupse usa nicepara ejecutar procesos con menor prioridad. La HUPseñal es, por convención, la forma en que un terminal advierte procesos dependientes de cierre de sesión

usuario2660420
fuente