Respuestas:
¿Qué es mejor, un pez o una bicicleta? nohup
y exec
hacer cosas diferentes.
exec
reemplaza el shell con otro programa. El uso exec
en un trabajo en segundo plano simple no es útil: exec myprogram; more stuff
reemplaza el shell con myprogram
y no se ejecuta more stuff
, a diferencia de lo myprogram; more stuff
que se ejecuta more stuff
cuando myprogram
termina; pero exec myprogram & more stuff
comienza myprogram
en segundo plano y luego se ejecuta more stuff
, al igual que myprogram & more stuff
.
nohup
ejecuta 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 nohup
evita 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).
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 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 &
exec firefox
, el shell ya no se ejecuta: ha sido reemplazado por firefox
. Puede pensar exec
en 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 firefox
proceso finaliza. El terminal se da cuenta de que su proceso hijo ha salido y, por lo tanto, sale a su vez.
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.
exec
el proceso muere cuando SIGHUP
se recibe un, pero el nohup
proceso continúa.
exec
reemplaza el proceso en ejecución, pero eso no parece suceder cuando usas &
en segundo plano el comando ejecutado. Ni en bash ni zsh.
exec smth &
es lo mismo que (exec smth) &
, ¿no es eso lo que está sucediendo?
(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.
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.
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?
No se puede comparar nohup
con exec
. Cuando ejecuta un ejecutable con nohup
, el proceso no se anulará cuando cierre la sesión (sesión ssh); generalmente nohup
se usa nice
para ejecutar procesos con menor prioridad. La HUP
señal es, por convención, la forma en que un terminal advierte procesos dependientes de cierre de sesión