用systemd管理python脚本的核心是编写正确的.service文件:放于/etc/systemd/system/,execstart直接调用虚拟环境python解释器路径,配置user、group、workingdirectory、restart=always及journal日志,再通过daemon-reload、start、journalctl -f三步验证。

直接用 systemd 管理 Python 脚本做后台服务,核心不是“怎么让它后台跑”,而是“怎么让它稳定、可管、可恢复地运行”。关键在于写对 .service 文件,而不是靠 nohup 或 & 这类临时手段。
服务文件必须放在正确位置
系统级服务配置统一放在这里:
- /etc/systemd/system/(推荐,你手动创建的服务都放这里)
- 不要放
/lib/systemd/system/—— 那是软件包安装时用的,手动改可能被覆盖 - 文件名必须以
.service结尾,比如mybot.service
ExecStart 必须指向真实的 Python 解释器路径
别写 source venv/bin/activate && python script.py —— 这在 systemd 里完全无效。原因很实在:source 是 bash 特有命令,systemd 默认用 /bin/sh(通常是 dash),根本不认识它。
✅ 正确做法:直接调用虚拟环境里的解释器,例如:
ExecStart=/opt/myapp/venv/bin/python3 /opt/myapp/main.pyExecStart=/home/user/miniconda3/envs/api/bin/python /home/user/api/app.py
这样启动的进程天然使用该环境的所有依赖,无需激活,也不受 shell 类型限制。
基础但不能少的关键配置项
一个能真正用起来的服务,至少要包含这几点:
- User= 和 Group=:明确指定运行用户,避免 root 权限滥用;确保该用户对脚本、日志、虚拟环境有读写权限
-
WorkingDirectory=:设成脚本所在目录,否则相对路径(如
open("config.yaml"))会出错 - Restart=always 和 RestartSec=5:让服务挂了自动重启,避免人工干预
- StandardOutput=journal 和 StandardError=journal:把输出统一交给 journalctl 管理,查日志只需一条命令
验证和调试最实用的三步
写完服务文件后,别急着 enable,先走通这三步:
- 执行
sudo systemctl daemon-reload—— 让 systemd 重新读取配置 - 执行
sudo systemctl start mybot.service—— 启动服务 - 立即执行
sudo journalctl -u mybot.service -f—— 实时看日志,有没有 import 错误、路径错误、权限拒绝等
看到 Active: active (running) 且日志持续输出,才算真正跑通。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











