Ubuntu下Python开发的Telegram Bot无法以systemd后台服务启动
Telegram Bot后台服务启动卡住问题排查(终端运行正常)
问题场景
- 基于
telebot库开发的Telegram Bot,在终端执行python test_bot.py时运行完全正常 - 配置systemd服务文件
test_bot.service并放置到/etc/systemd/system目录,执行systemctl daemon-reload后服务可在列表中正常显示,但执行systemctl start test_bot时命令卡住无任何反馈 - 运行系统:Ubuntu 22.04.3 LTS
可能的原因及解决办法
1. Python路径不匹配
Ubuntu 22.04默认以python3作为Python命令,/usr/bin/python可能未指向有效的Python3环境,甚至可能指向已弃用的Python2,导致服务启动时无法正确执行脚本。
- 解决:将服务文件
[Service]段的ExecStart修改为使用python3:
若不确定路径,可先在终端执行ExecStart=/usr/bin/python3 /etc/tg_bots/test4477qwe_bot/test_bot.pywhich python3获取准确路径后替换。
2. 权限与依赖库访问问题
systemd默认以root用户运行服务,若你的telebot库是安装在普通用户的本地目录(如~/.local/lib/python3.x/site-packages),root用户无法读取该依赖,导致启动失败并卡住。
- 解决方式二选一:
- 全局安装依赖库:执行
sudo pip3 install telebot,让root用户能访问到库文件 - 指定服务运行用户:在
[Service]段添加User=你的普通用户名,确保该用户拥有脚本访问权限且已安装telebot库
- 全局安装依赖库:执行
3. 日志缓冲导致启动阻塞
Type=simple模式下,systemd会等待服务的标准输出/错误流建立连接,若脚本输出存在缓冲,可能导致启动命令卡住。
- 解决:
- 在
[Service]段添加日志配置,让输出直接写入systemd日志:StandardOutput=journal+console StandardError=journal+console - 或把
Type=simple改为Type=exec,避免缓冲问题
修改后重新加载配置并启动服务,然后用journalctl -u test_bot.service -f查看实时日志,即可定位具体错误信息。
- 在
4. 环境变量差异(如代理)
终端运行时的环境变量(比如代理配置)不会自动继承给systemd服务,若你的网络需要代理才能连接Telegram服务器,服务会因无法建立连接而卡住。
- 解决:在
[Service]段添加代理环境变量(根据实际情况修改):Environment="HTTP_PROXY=http://your-proxy-address:port" Environment="HTTPS_PROXY=http://your-proxy-address:port"
关于Ubuntu 22.04的适配性
Ubuntu 22.04完全支持运行Python编写的Telegram Bot,不存在系统层面的兼容性问题,故障原因均来自systemd服务的配置细节。
内容的提问来源于stack exchange,提问作者Vladimir Naumov
相关产品推荐
相关产品推荐

