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:
- Abre tu terminal o sesión SSH.
- Ve al directorio con tu script de Python.
-
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:
-
Inicia una nueva sesión de Screen:
screen -S mi_script_python -
Ejecuta tu script de Python:
python bgservice.py -
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:
-
Inicia una nueva sesión de Tmux:
tmux new -s mi_script_python -
Ejecuta tu script de Python:
python bgservice.py -
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:
-
Instala Supervisor:
sudo apt-get install supervisor -
Crea un archivo de configuración para tu script de Python:
sudo nano /etc/supervisor/conf.d/bgservice.conf -
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 -
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:
-
Crea un archivo de servicio:
sudo nano /etc/systemd/system/bgservice.service -
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 -
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.





