Ejecutar el bot en segundo plano¶
En este artículo
Para que un bot de Python (o de cualquier otro lenguaje) se ejecute continuamente, se reinicie automáticamente ante fallos y inicie tras un reinicio del servidor, simplemente ejecutar python main.py no es suficiente. Necesitas un servicio en segundo plano completo.
A continuación se presentan tres métodos probados: desde el sencillo screen hasta el robusto systemd. Elige según tus requisitos.
Preparación del entorno¶
-
Coloca el código del bot, por ejemplo, en
/home/user/bot: -
Crea y activa un entorno virtual para aislar las dependencias:
-
Instala las dependencias:
-
Prueba el lanzamiento manual:
Nota
No ejecutes el bot como root a menos que sea necesario. Es mejor crear un usuario dedicado:
Método 1. screen — lanzamiento rápido (para pruebas y desarrollo)¶
Ventajas: más fácil para empezar.
Desventajas: no se reinicia tras un fallo o reinicio — no apto para producción.
Instalación:
Lanzamiento:
Gestión:
| Acción | Comando |
|---|---|
| Desconectar de la sesión (dejar en segundo plano) | Ctrl + A, luego D |
| Ver lista de sesiones | screen -ls |
| Volver a la sesión | screen -r bot |
| Terminar sesión desde dentro | Ctrl + A, luego K > Y |
Información
Tras un reinicio del servidor o un fallo del script, el bot permanecerá detenido. Úsalo solo para tareas temporales.
Método 2. systemd — estándar de Linux para servicios (recomendado)¶
Ventajas: inicio automático, reinicio ante errores, registro de logs, integración con el sistema.
Desventajas: requiere escribir una configuración.
-
Crea un archivo de unidad:
-
Pega la configuración (¡adapta las rutas y el usuario!):
[Unit] Description=Telegram Bot Service After=network.target StartLimitIntervalSec=30 StartLimitBurst=5 [Service] Type=simple User=botuser # ← ¡recomendado no usar root! Group=botuser WorkingDirectory=/home/user/bot ExecStart=/home/user/bot/venv/bin/python /home/user/bot/main.py Restart=always RestartSec=10 Environment="PYTHONUNBUFFERED=1" # para que los logs no se almacenen en búfer # Seguridad (opcional, pero recomendada) NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ProtectHome=true ReadWritePaths=/home/user/bot/data/ # si el bot necesita acceso a datos [Install] WantedBy=multi-user.target -
Habilita el servicio:
-
Comprueba el estado y los logs:
Consejos de seguridad
Restringe el acceso del servicio a partes innecesarias del sistema (vía ProtectSystem, ReadOnlyPaths); Si el bot solo necesita internet, añade RestrictNetwork=true y configura IPAddressAllow=...; Usa RuntimeDirectory= para archivos temporales.
Método 3. PM2 — gestor de procesos (para Node.js, pero soporta Python)¶
Ventajas: simplicidad, logs integrados, monitorización, interfaz web.
Desventajas: requiere Node.js, excesivo para bots de Python simples.
Instalación:
# Instalar Node.js y npm (si no están instalados)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
# Instalar PM2 globalmente
sudo npm install -g pm2
Iniciar el bot de Python:
Comandos útiles:
| Comando | Propósito |
|---|---|
pm2 list | Lista de procesos |
pm2 logs my-bot | Ver logs |
pm2 monit | Monitorización en tiempo real |
pm2 startup | Configurar inicio automático tras reinicio |
pm2 save | Guardar procesos actuales |
Información
Tras ejecutar pm2 startup, sigue las instrucciones del terminal: PM2 generará una unidad systemd para el inicio automático.
Comparación de métodos¶
| Criterio | screen | systemd | PM2 |
|---|---|---|---|
| Inicio automático tras reinicio | No | Sí | Sí (requiere pm2 startup) |
| Reinicio ante fallo | No | Sí | Sí |
| Registro de logs | Solo en sesión | journalctl | Logs integrados |
| Seguridad | Baja | Alta (ajustes de aislamiento) | Media |
| Complejidad de configuración | Baja | Media | Baja (pero requiere Node.js) |
| Apto para producción | No | Recomendado | Sí (si ya usas Node.js) |
Adicional
Configura alertas cuando el bot se detenga (por ejemplo, vía systemd + healthchecks.io);
Actualiza regularmente las dependencias pip list --outdated;
Usa archivos .env y python-dotenv para almacenar tokens (¡y exclúyelos de Git!).