¿Cómo ejecutar un script de Python en segundo plano después de cerrar la sesión SSH?

Publicado 17 de octubre de 2024

Problema: Ejecutar scripts de Python después de cerrar sesión SSH

La ejecución de scripts de Python en un servidor remoto puede detenerse cuando se cierra la conexión SSH. Este problema impide que los scripts de larga duración completen sus tareas. Se necesita una forma de mantener los scripts de Python ejecutándose en segundo plano después de cerrar la sesión SSH.

Solución: Usar el comando nohup

¿Qué es nohup?

El comando nohup, abreviatura de "no hangup", es una herramienta que permite ejecutar procesos que siguen funcionando después de cerrar sesión en una shell. Evita que el sistema envíe la señal de desconexión (SIGHUP) al proceso en ejecución cuando se cierra la terminal. Esta señal normalmente termina los procesos vinculados a la terminal cerrada.

Implementar nohup con scripts de Python

Para usar nohup con tu script de Python:

  1. Abre tu terminal o sesión SSH.
  2. Ve al directorio con tu script de Python.
  3. Ejecuta este comando:

    nohup python bgservice.py &

El símbolo (&) al final del comando indica al sistema que ejecute el proceso en segundo plano. Esto te permite usar la terminal para otras tareas mientras tu script se ejecuta.

Consejo: Verificar procesos en ejecución

Para comprobar si tu proceso nohup está en ejecución, usa el comando 'ps':

ps aux | grep python

Esto mostrará todos los procesos de Python en ejecución, incluyendo tu comando nohup.

Gestionar la salida con nohup

Por defecto, nohup envía la salida del comando a un archivo llamado "nohup.out" en el directorio actual. Si quieres usar un archivo de salida personalizado, puedes modificar el comando así:

nohup python bgservice.py > salida_personalizada.log 2>&1 &

Este comando envía tanto la salida estándar como el error estándar al archivo "salida_personalizada.log".

Métodos alternativos para ejecución en segundo plano

Screen: Un multiplexor de terminal

Screen es un multiplexor de terminal que te permite ejecutar múltiples sesiones de terminal en una ventana. Ayuda a mantener los procesos en ejecución después de desconectarte de una sesión SSH.

Para usar Screen con tu script de Python:

  1. Inicia una nueva sesión de Screen:

    screen -S mi_script_python
  2. Ejecuta tu script de Python:

    python bgservice.py
  3. Desconéctate de la sesión de Screen presionando Ctrl+A, luego D.

Para volver a conectarte a la sesión más tarde, usa:

screen -r mi_script_python

Consejo: Gestionar múltiples sesiones de Screen

Para gestionar múltiples sesiones de Screen, usa el comando screen -ls para listar todas las sesiones activas. Esto te permite ver qué sesiones están en ejecución y sus nombres, facilitando el cambio entre diferentes procesos en segundo plano.

Tmux: Alternativa de multiplexor de terminal

Tmux es otro multiplexor de terminal similar a Screen. Tiene más funciones y a menudo se considera más fácil de usar.

Para usar Tmux con tu script de Python:

  1. Inicia una nueva sesión de Tmux:

    tmux new -s mi_script_python
  2. Ejecuta tu script de Python:

    python bgservice.py
  3. Desconéctate de la sesión de Tmux presionando Ctrl+B, luego D.

Para volver a conectarte a la sesión más tarde, usa:

tmux attach -t mi_script_python

En comparación con Screen, Tmux ofrece:

  • Mejor gestión de ventanas
  • Más opciones de personalización
  • Configuración más sencilla de la barra de estado

Tanto Screen como Tmux son buenos para mantener los scripts de Python ejecutándose en segundo plano. La elección entre ellos a menudo depende de tus preferencias.

Herramientas de gestión de procesos

Supervisor: Un sistema de control de procesos

Supervisor es un sistema de control de procesos para sistemas tipo Unix. Gestiona scripts de Python de larga duración. Supervisor inicia, detiene y monitorea procesos, y puede reiniciarlos si se bloquean.

Beneficios de usar Supervisor para scripts de Python:

  • Reinicio automático en caso de bloqueo
  • Gestión de procesos a través de interfaz web o línea de comandos
  • Registro de la salida del proceso
  • Agrupación de procesos para su gestión

Configuración básica de Supervisor:

  1. Instala Supervisor:

    sudo apt-get install supervisor
  2. Crea un archivo de configuración para tu script de Python:

    sudo nano /etc/supervisor/conf.d/bgservice.conf
  3. Añade el siguiente contenido al archivo:

    [program:bgservice]
    command=python /ruta/a/bgservice.py
    directory=/ruta/al/directorio/del/script
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/bgservice.err.log
    stdout_logfile=/var/log/bgservice.out.log
  4. Recarga Supervisor e inicia tu programa:

    sudo supervisorctl reread
    sudo supervisorctl update
    sudo supervisorctl start bgservice

Consejo: Configurar variables de entorno

Para establecer variables de entorno para tu script de Python en Supervisor, añade la siguiente línea a tu archivo de configuración:

environment=VAR_ENTORNO1="valor1",VAR_ENTORNO2="valor2"

Esto te permite pasar opciones de configuración a tu script sin modificar el código.

systemd: Gestor de sistema y servicios

systemd es un gestor de sistema y servicios para sistemas operativos Linux. Gestiona scripts de Python como servicios del sistema.

Uso de systemd para la gestión de scripts de Python:

  1. Crea un archivo de servicio:

    sudo nano /etc/systemd/system/bgservice.service
  2. Añade el siguiente contenido:

    [Unit]
    Description=Servicio en segundo plano de script Python
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/python3 /ruta/a/bgservice.py
    Restart=always
    User=tuusuario
    
    [Install]
    WantedBy=multi-user.target
  3. Recarga systemd, habilita e inicia el servicio:

    sudo systemctl daemon-reload
    sudo systemctl enable bgservice.service
    sudo systemctl start bgservice.service

Para gestionar tu servicio systemd:

  • Verificar estado: sudo systemctl status bgservice.service
  • Detener servicio: sudo systemctl stop bgservice.service
  • Reiniciar servicio: sudo systemctl restart bgservice.service

Supervisor y systemd ofrecen soluciones para gestionar scripts de Python de larga duración. systemd está más integrado en los sistemas Linux modernos, mientras que Supervisor se centra en la gestión de procesos.