在后台运行机器人¶
在这篇文章中
要让 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] 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 存储令牌(并从 Git 中排除它们!)。