在后台运行机器人¶
在这篇文章中
若要让 Python(或任何其他)机器人实现**持续运行**、故障后自动重启**以及**服务器重启后自动启动,仅仅运行 python main.py 是不够的。你需要一个功能完备的后台服务。
以下是三种经过验证的方法:从简单的 screen 到工业级的 systemd。请根据您的需求进行选择。
准备环境¶
-
将机器人代码放置在指定目录,例如
/home/user/bot: -
创建并激活虚拟环境以**隔离依赖**:
-
安装依赖:
-
测试手动启动:
备注
除非必要,否则请勿以 root 用户身份运行机器人。最好创建一个专用用户:
方法 1. screen - 快速启动(用于测试和开发)¶
优点:上手最快。
缺点:崩溃或重启后不会自动重启 —— 不适用于生产环境。
安装:
启动:
管理:
| 操作 | 命令 |
|---|---|
| 脱离会话 (在后台运行) | Ctrl + A, 然后 D |
| 查看会话列表 | screen -ls |
| 返回会话 | screen -r bot |
| 在会话内终止会话 | Ctrl + A, 然后 K > Y |
信息
在服务器重启或脚本崩溃后,机器人将**保持停止状态**。仅用于临时任务。
方法 2. systemd - Linux 标准服务管理(推荐)¶
优点:自启动、错误后重启、日志记录、系统集成。
缺点:需要编写配置文件。
-
创建单元文件 (unit file):
-
粘贴配置(请根据实际情况修改路径和用户!):
[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 -
启用服务:
-
查看状态和日志:
安全提示
通过 ProtectSystem 和 ReadOnlyPaths 等设置,限制服务访问系统中不必要的部件; 如果机器人仅需要访问互联网,请添加 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 机器人:
常用命令:
| 命令 | 用途 |
|---|---|
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 之外!)。