Skip to content

在后台运行机器人

在这篇文章中

要让 Python(或其他语言)机器人**持续运行**、在故障时自动重启**以及**在服务器重启后启动,仅运行 python main.py 是不够的。您需要一个完整的后台服务。

以下是三种经过验证的方法:从简单的 screen 到工业级的 systemd。请根据您的要求进行选择。

准备环境

  1. 将机器人代码放置在指定目录中,例如 /home/user/bot

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

  2. 创建并激活虚拟环境**以隔离依赖项**:

    python3 -m venv venv
    source venv/bin/activate
    

  3. 安装依赖项:

    pip install -r requirements.txt
    # 如果文件不存在,请手动安装,例如 pip install python-telegram-bot
    

  4. 测试手动启动:

    python main.py
    

备注

除非必要,否则不要以 root 身份运行机器人。最好创建一个专用用户:

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

方法 1. screen — 快速启动(用于测试和开发)

优点:最容易上手。
缺点:崩溃或重启后不会重启——不适合生产环境

安装:

sudo apt update && sudo apt install screen -y

启动:

screen -S bot  # 创建命名会话
source venv/bin/activate
python main.py

管理:

操作 命令
分离会话(留在后台) Ctrl + A,然后按 D
查看会话列表 screen -ls
返回会话 screen -r bot
从内部终止会话 Ctrl + A,然后按 K > Y

信息

服务器重启或脚本崩溃后,机器人将**保持停止状态**。仅用于临时任务。

方法 2. systemd — Linux 服务标准(推荐)

优点:自动启动、错误时重启、日志记录、系统集成。
缺点:需要编写配置文件。

  1. 创建单元文件:

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

  2. 粘贴配置(请调整路径和用户!):

    [Unit]
    Description=Telegram Bot Service
    After=network.target
    StartLimitIntervalSec=30
    StartLimitBurst=5
    
    
    [Service]
    Type=simple
    User=botuser                 # ← 建议不要使用 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"  # 防止日志缓冲
    
    
    # 安全设置(可选,但推荐)
    NoNewPrivileges=true
    PrivateTmp=true
    ProtectSystem=strict
    ProtectHome=true
    ReadWritePaths=/home/user/bot/data/  # 如果机器人需要数据访问权限
    
    
    [Install]
    WantedBy=multi-user.target
    

  3. 启用服务:

    sudo systemctl daemon-reload
    sudo systemctl enable bot.service   # 开机自启
    sudo systemctl start bot.service    # 立即启动
    

  4. 检查状态和日志:

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

安全提示

限制服务访问系统中不必要的部分(通过 ProtectSystemReadOnlyPaths); 如果机器人只需要互联网访问——添加 RestrictNetwork=true 并配置 IPAddressAllow=...; 使用 RuntimeDirectory= 处理临时文件。

方法 3. PM2 — 进程管理器(适用于 Node.js,但也支持 Python)

优点:简单、内置日志、监控、Web 界面。
缺点:需要 Node.js,对于简单的 Python 机器人来说过于复杂。

安装:

# 安装 Node.js 和 npm(如果尚未安装)
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs


# 全局安装 PM2
sudo npm install -g pm2

启动 Python 机器人:

cd /home/user/bot
pm2 start main.py --name "my-bot" --interpreter ./venv/bin/python

常用命令:

命令 用途
pm2 list 进程列表
pm2 logs my-bot 查看日志
pm2 monit 实时监控
pm2 startup 配置重启后自动启动
pm2 save 保存当前进程

信息

运行 pm2 startup 后,请遵循终端中的说明——PM2 将生成一个 systemd 单元以实现自动启动。

方法比较

标准 screen systemd PM2
重启后自动启动 是(需要 pm2 startup
崩溃后重启
日志记录 仅在会话中 journalctl 内置日志
安全性 高(隔离设置)
配置复杂度 低(但需要 Node.js)
适合生产环境 推荐 是(如果已在使用 Node.js)

补充说明

设置机器人停止时的警报(例如,通过 systemd + healthchecks.io);
定期更新依赖项 pip list --outdated
使用 .env 文件和 python-dotenv 存储令牌(并从 Git 中排除它们!)。

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