Saltar a contenido

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

  1. Coloca el código del bot, por ejemplo, en /home/user/bot:

    mkdir -p /home/user/bot && cd /home/user/bot
    

  2. Crea y activa un entorno virtual para aislar las dependencias:

    python3 -m venv venv
    source venv/bin/activate
    

  3. Instala las dependencias:

    pip install -r requirements.txt
    # Si el archivo no existe, instala manualmente, por ejemplo: pip install python-telegram-bot
    

  4. Prueba el lanzamiento manual:

    python main.py
    

Nota

No ejecutes el bot como root a menos que sea necesario. Es mejor crear un usuario dedicado:

sudo adduser --disabled-login botuser
sudo chown -R botuser:botuser /home/user/bot

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:

sudo apt update && sudo apt install screen -y

Lanzamiento:

screen -S bot  # crear una sesión con nombre
source venv/bin/activate
python main.py

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.

  1. Crea un archivo de unidad:

    sudo nano /etc/systemd/system/bot.service
    

  2. 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
    

  3. Habilita el servicio:

    sudo systemctl daemon-reload
    sudo systemctl enable bot.service   # inicio automático al arrancar
    sudo systemctl start bot.service    # iniciar ahora
    

  4. Comprueba el estado y los logs:

    sudo systemctl status bot.service
    journalctl -u bot.service -f --since "1 hour ago"
    

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:

cd /home/user/bot
pm2 start main.py --name "my-bot" --interpreter ./venv/bin/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í (requiere pm2 startup)
Reinicio ante fallo No
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!).

question_mark
Is there anything I can help you with?
question_mark
AI Assistant ×