跳转至

在后台运行机器人

在这篇文章中

若要让 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. 创建单元文件 (unit file):

    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 来存储 Token(并确保将其排除在 Git 之外!)。

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