¿Por qué utilizar "nohup &" en lugar de "exec &"?

¿Por qué utilizar "nohup &" en lugar de "exec &"?

Sé que, nohupal ser binario, se puede acceder a él desde cualquier shell. Pero el execintegrado 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? nohupy exechacer cosas diferentes.

execreemplaza el shell con otro programa. Usarlo execen un trabajo en segundo plano simple no es útil: exec myprogram; more stuffreemplaza el shell con myprogramy por lo tanto no se ejecuta more stuff, a diferencia de myprogram; more stuffcuál se ejecuta more stuffcuando myprogramfinaliza; pero exec myprogram & more stuffcomienza myprogramen segundo plano y luego se ejecuta more stuff, tal como myprogram & more stuff.

nohupejecuta 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 nohupevita 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).

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 en su 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 &

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.

execEl proceso muere cuando SIGHUPse recibe a, pero nohupel 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 nohupcon exec. Cuando ejecuta un ejecutable con nohup, el proceso no se finalizará cuando cierre la sesión (sesión ssh); normalmente nohupse utiliza para niceejecutar procesos con una prioridad más baja. La HUPseñal es, por convención, la forma en que un terminal advierte a los procesos dependientes del cierre de sesión.

información relacionada