Sé que puedo agregar &
un comando para ejecutar el proceso en segundo plano.
Estoy ingresando en un cuadro de Ubuntu 12.04 y ejecuto un programa de Python con $python program.py &
, pero cuando cierro la ventana del terminal recibo un mensaje que dice que cerrar el terminal matará el proceso en ejecución.
¿Por qué es esto? Estoy usando el ampersand para ejecutar el proceso en segundo plano. ¿Cómo puedo hacer que se ejecute independientemente de si estoy en SSH?
Respuestas:
Cuando cierra una ventana de terminal, el emulador de terminal envía un SIGHUP al proceso que está ejecutando, su shell. Su shell luego reenvía ese SIGHUP a todo lo que está ejecutando. En su sistema local, este es el ssh. El ssh luego reenvía el SIGHUP a lo que está ejecutando, el shell remoto. Entonces, su shell remoto envía un SIGHUP a todos sus procesos, su programa en segundo plano.
Hay 2 formas de evitar esto.
disown
comando después de poner en segundo plano su proceso. Esto hará que el shell lo olvide.nohup
(nohup $python program.py &
). Esto logra lo mismo, pero mediante el uso de un proceso intermedio. Básicamente, ignora la señal SIGHUP, y luego bifurca y ejecuta su programa que hereda la configuración, y luego sale. Debido a que se bifurcó, el programa que se está iniciando no es hijo del shell, y el shell no lo sabe. Y a menos que instale un controlador de señal para SIGHUP, mantiene la acción de ignorar de todos modos.logout
lugar de cerrar la ventana de terminal. Cuando lo usalogout
, esto no es un SIGHUP, por lo que el shell no enviará un SIGHUP a ninguno de sus hijos.Además, debe asegurarse de que su programa no escriba en el terminal a través de STDOUT o STDERR, ya que ambos ya no existirán una vez que el terminal salga. Si no los redirige a algo como
/dev/null
, el programa aún se ejecutará, pero si intenta escribirles, obtendrá un SIGPIPE, y la acción predeterminada de SIGPIPE es matar el proceso).fuente
ssh
morir hace que la conexión se caiga, la conexión a la caída hacesshd
que muera el otro extremo. Ese sshd que controla el lado maestro del pseudo-terminal que ejecuta el shell remoto, cuando muere, es un bloqueo (es como desconectar un terminal real), por lo que el sistema envía un SIGHUP al shell remoto.nohup
genera unnohup.out
archivo con salida del programa que comienza con él. Puede ser molesto eliminar ese archivo cada vez que ha usado nohup para iniciar una aplicación de esta manera (o necesitaría redirigir su salida a/dev/null
).nohup python program.py &
recomendaría usar en susetsid python program.py
lugar, lo que anula inmediatamente el programa.El proceso se ejecuta en segundo plano en el terminal, pero la salida de
stdout
(ystderr
) todavía se envía al terminal. Para detener esto, agregue> /dev/null 2>&1
antes&
de redirigir ambas salidas a/dev/null
- agregardisown
también asegura que el proceso no se elimine después de cerrar el terminal:En su caso esto sería:
fuente
El
&
operador separa los comandos para ejecutar en paralelo, al igual que;
separa los comandos para ejecutar en serie. Ambos tipos de comandos aún se ejecutarán como elementos secundarios del proceso de shell .Por lo tanto, cuando cierre el shell que inició esos niños, los niños también se cerrarán.
Lo que parece querer es un proceso de demonio , que es significativamente más complicado porque necesita disociarse por completo del proceso padre. El shell generalmente no tiene una forma simple de hacerlo.
fuente
Cuando cierra la sesión, los procesos en segundo plano asociados con la sesión de inicio de sesión normalmente también se eliminan. Si desea que se desconecten de la sesión, ejecútelos con
nohup
.fuente
Después del comando que termina con ampersand (
&
), en el símbolo del sistema, ejecute el comandobg
:Esto pondrá el comando "&" en segundo plano.
Esto enumerará los trabajos que se ejecutan en segundo plano.
Esto traerá el trabajo # 1 al primer plano
Otra forma, (para poder cerrar sesión)
Se pueden enviar varias líneas al
at
comando, antes de quevea ^ d (Control-D)
man at
.fuente