在 Linux 系统中,编写 systemd service 文件实现 Python 脚本开机自启,最推荐的方式是在 `/etc/systemd/system/` 目录下创建 `.service` 单元文件,配置 `ExecStart` 指向 Python 解释器和脚本绝对路径,最后使用 `systemctl enable` 启用服务。
先说结论:systemd 是主流 Linux 发行版的标准初始化系统,适合管理后台常驻 Python 进程,配置前需确认 Python 环境路径,验收时需检查服务状态和日志。
- 适合:Ubuntu 16.04+、CentOS 7+、Debian 8+ 等使用 systemd 的 Linux 服务器
- 先看:Python 解释器绝对路径、脚本绝对路径、运行用户权限
- 建议:配置自动重启策略、重定向标准输出到日志、设置工作目录
命令速用版
以下命令可直接创建并启用一个名为 myscript.service 的服务,请根据实际路径修改。
sudo nano /etc/systemd/system/myscript.service填入以下内容:
[Unit]
Description=My Python Script
After=network.target
[Service]
User=your_username
WorkingDirectory=/path/to/script
ExecStart=/usr/bin/python3 /path/to/script/main.py
Restart=always
[Install]
WantedBy=multi-user.target保存后执行:
sudo systemctl daemon-reload
sudo systemctl enable myscript.service
sudo systemctl start myscript.service为什么会这样
systemd 负责管理系统启动过程中的服务依赖和进程守护,比传统的 crontab 或 init.d 脚本更稳定。
使用 systemd 管理 Python 脚本的主要原因是它能监控进程状态,在脚本意外退出时自动重启,并统一收集标准输出和错误日志到 journal 系统,方便故障排查。
分步处理
第一步:确认 Python 环境路径。执行 which python3 获取解释器绝对路径,避免使用相对路径。
第二步:创建 service 文件。在 /etc/systemd/system/ 目录下新建文件,文件名必须以 .service 结尾。
第三步:配置关键参数。ExecStart 必须写绝对路径,User 指定运行用户,WorkingDirectory 指定脚本所在目录。
第四步:重载并启用。修改配置后必须执行 systemctl daemon-reload,否则 systemd 不会识别新文件。
怎么验证是否生效
执行 systemctl status myscript.service 查看状态,显示 active (running) 表示服务正常。
查看日志输出执行 journalctl -u myscript.service -f,确认脚本打印信息是否正常出现。
重启服务器后,再次检查服务状态,确认开机自启生效。
常见坑
路径错误:ExecStart 中 Python 或脚本路径不是绝对路径,导致服务启动失败。
环境变量缺失:systemd 服务默认环境变量较少,脚本中依赖的环境变量需在 service 文件中通过 Environment 指定。
权限不足:运行用户没有脚本执行权限或写入日志目录的权限,需检查文件归属和 chmod 设置。
虚拟环境未激活:如果使用 venv,ExecStart 应直接指向 venv 中的 python 解释器路径,而不是 source activate。
常见问题
脚本崩溃后会自动重启吗?
需要在 [Service] 段配置 Restart=always 或 Restart=on-failure,否则默认不会自动重启。
如何在 service 中设置环境变量?
在 [Service] 段使用 Environment="KEY=VALUE" 格式添加,多变量可写多行。
为什么脚本找不到模块?
systemd 环境可能未加载用户 Profile,建议在 ExecStart 中使用虚拟环境的 python 路径或指定 PYTHONPATH。