shell – Estoy usando `&`: ¿por qué no se está ejecutando el proceso en segundo plano?

Pregunta:

Sé que puedo agregar & a un comando para ejecutar el proceso en segundo plano.

Estoy ingresando por SSH en una caja de Ubuntu 12.04 y ejecutando un programa de Python con $python program.py & , pero cuando voy a cerrar la ventana de la terminal, aparece un mensaje que dice que cerrar la terminal matará el proceso en ejecución.

¿Por qué es esto? Estoy usando el signo comercial para ejecutar el proceso en segundo plano. ¿Cómo puedo hacer que se ejecute independientemente de si tengo SSH?

Respuesta:

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 se 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 dos formas de evitar esto.

  1. Desasocie el programa en segundo plano de su caparazón.
    1. Utilice el comando disown después de disown fondo de su proceso. Esto hará que el caparazón se olvide de él.
    2. Prefije su comando con nohup ( nohup $python program.py & ). Esto logra lo mismo, pero utilizando 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á lanzando no es un hijo del shell, y el shell no lo sabe. Y a menos que instale un controlador de señales para SIGHUP, mantiene la acción de ignorar de todos modos.
  2. Use logout (o Ctrl + d ) en lugar de cerrar la ventana de terminal. Cuando usa el logout , 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 la terminal a través de STDOUT o STDERR, ya que ambos dejarán de existir una vez que la 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).

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım