Cuando ejecuto estos cuatro comandos en Xubuntu 16.04, ya sea localmente o sobre ssh, todos parecen hacer exactamente lo mismo:
export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally
-
gedit &
-
gedit & disown
-
nohup gedit
-
nohup gedit & disown
Yo no obtengo la diferencia entre gedit &
y gedit & disown
porque si mato la terminal principal o salgo de una sesión ssh, parecería que gedit es «repudiado» en cualquier escenario.
En cuanto a dos y tres, la única diferencia que veo es que la salida del comando se registra en un archivo separado y continuará registrándose en ese registro separado incluso si la sesión de shell original que generó el proceso bg se cancela.
En cuanto a tres y cuatro, sigo leyendo que hay una diferencia técnica, pero no puedo entender en absoluto por qué preferirías uno sobre el otro.
¿Cuál debería usar? He visto los cuatro comandos usados en tutoriales y Q & Como, ya pesar de algunas respuestas realmente excelentes que describen las diferencias técnicas entre nohup y disown, parece que no puedo obtener una recomendación clara (excepto quizás para propósitos de registro o compatibilidad con shell) sobre cuál debería usar.
Comentarios
- Necesita & en todos los casos en los que desee continuar en el shell (y el programa no se bifurca). Es posible que no necesite nohup para los programas que cierran los descriptores de archivo y se desvinculan (eso sí, Gibt es cierto para la mayoría de las aplicaciones GUI). Puede usar disown después del hecho (si olvida nohup) y como está escrito antes, las aplicaciones GUI no lo necesitan.
Answer
Cuando necesito ejecutar una secuencia de comandos que se ejecutará durante mucho tiempo , y» sigo una sesión ssh
, quiero:
-
La tarea debe continuar incluso cuando la red se interrumpe o cuando empaco mi computadora portátil y me voy .
a. La tarea puede finalizar sin mi participación interactiva.
nohup do_my_stuff &
b. Es posible que la tarea necesite algo de mí en stdin .
man tmux history -w tmux do_my_stuff
-
El proceso en segundo plano está mejorando de alguna manera mi sesión actual y debería morir junto con la sesión. Una rareza.
enhance_my_session >>/tmp/enhance.$$.log 2>&1 &
-
Quiero que la cosa escupe algunos registros al azar en mi sesión ssh. Espera, ¿qué? No, nunca querría eso. Gracias you
disown
. -
Otra cosa que nunca quiero: convertir el proceso a un demonio completamente separado, pero evite iniciarlo automáticamente en el siguiente arranque. Nunca querría eso porque no puedo predecir cuándo se reiniciará el sistema y quién lo reiniciará.
Respuesta
Por lo general, hago lo siguiente:
-
myprog &
si solo quiero ejecutar algo en segundo plano desde mi shell de inicio de sesión actual. Esto es adecuado para mí el 99% del tiempo … -
nohup myprog > /my/path/output.txt &
si comienzo algo desde el shell, pero quiero luego cierre la sesión (quizás mientras la tarea en segundo plano aún se está ejecutando).
Responder
Usted debe diferenciar salir del shell de abortar la terminal.
- El shell mata todos los trabajos conocidos (pero no sus hijos) cuando recibe una señal de aborto.
- El terminal mata todo para lo que era el terminal de control.
En general, la mejor solución (a nivel de usuario) en mi humilde opinión es screen
.
Si su tarea está más relacionada con el sistema que con el usuario, puede convertirla en un servicio systemd en lugar de iniciarlo manualmente.