Lanzar procesos que sobreviven al cierre de la sesión con nohup

última modificación:

Cuando ejecutamos un proceso largo en un servidor remoto y cerramos la sesión SSH, el proceso recibe la señal SIGHUP y termina. nohup (no hang up) evita esto: lanza el proceso de forma que ignore esa señal y siga ejecutándose aunque la sesión se cierre.

El uso más básico es añadir nohup delante del comando y & al final para enviarlo a segundo plano:

nohup python mi-script.py &

nohup confirma que está redirigiendo la salida:

nohup: ignoring input and appending output to `nohup.out'

La salida del proceso (tanto stdout como stderr) se redirige automáticamente a un archivo nohup.out en el directorio actual, a menos que la redirijamos nosotros:

nohup python mi-script.py > /tmp/mi-script.log 2>&1 &

El proceso sigue vivo aunque cerremos la sesión SSH. Para verlo después de reconectar usamos ps o htop:

ps aux | grep mi-script.py

Y para terminarlo cuando ya no lo necesitemos, usamos kill con su PID.

La diferencia con screen es que nohup es más simple pero no permite reconectar a la sesión: solo garantiza que el proceso siga vivo. screen permite además volver a ver la salida en tiempo real y interactuar con el proceso después de reconectar. Para procesos no interactivos (scripts, migraciones, conversiones), nohup es suficiente; para procesos con los que necesitamos interactuar, screen es mejor opción.