Estaba ayudando a un colega que estaba teniendo problemas con un proceso de fondo muriendo de forma intermitente.
Descubrí que estaban iniciando el proceso en segundo plano al iniciar sesión en el servidor y ejecutar:
su - <user> -c '<command>' &
"Ajá", exclamé. "Si inicia un comando con" & "se colgará cuando salga del terminal de control. Debe usar algo como nohup para lograr esto. Realmente este proceso debe admitir la ejecución como un demonio, tut tut".
Probamos el comando anterior para demostrar mi punto y ... parecía funcionar: el proceso iniciado por el comando no salió cuando salimos del terminal que ejecutó el comando anterior.
El comando es un script de Python personalizado cuya salida va a un archivo. Por lo que puedo decir, no hay una capacidad inteligente de "demonización" en el script. No hace ninguna de las cosas necesarias para ejecutarse como un demonio que aparece en la página Wikipedia: Daemon (informática): Creación .
Ejecutar el comando así se comporta como se esperaba:
<command> &
exit
En el caso anterior, el proceso en segundo plano iniciado por el comando sale cuando salimos del terminal.
Mi pregunta es esta:
Qué sucede cuando agregamos "su - -c &" que impide que el proceso salga cuando nuestro terminal sale. Me gustaría entender en detalle con respecto al terminal de control, entrada y salida estándar, etc.
¿Es esta una forma razonable de lograr el objetivo de ejecutar este comando como un proceso en segundo plano? ¿Si no, porque no?
Quiero propagar las mejores prácticas dentro de mi empresa, pero necesito poder demostrar y respaldar cualquier recomendación que haga.
También quiero entender qué está sucediendo exactamente.
fuente
chroot --userspec root:root / sh -c "exec some_forever_process" &
. El trabajo se ejecuta como el mismo usuario, sin explícitonohup
antes odisown
después. Entonces, para este caso, ¿cómo es que la señal no se puede entregar a la salida del plazo?some_forever_process
estaba destinado a ejecutarse para siempre (un demonio) y, por lo tanto, se protege contra la recepción de SIGHUP desde una salida de terminal (ejecutándose en su propio grupo de procesos).