如何编写 systemd service 文件实现开机自启 Python 脚本

文章导读
在 Linux 系统中,编写 systemd service 文件实现 Python 脚本开机自启,最推荐的方式是在 `/etc/systemd/system/` 目录下创建 `.service` 单元文件,配置 `ExecStart` 指向 Python 解释器和脚本绝对路径,最后使用 `systemctl enable` 启用服务。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
A A

在 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 service 文件实现开机自启 Python 脚本

使用 systemd 管理 Python 脚本的主要原因是它能监控进程状态,在脚本意外退出时自动重启,并统一收集标准输出和错误日志到 journal 系统,方便故障排查。

分步处理

第一步:确认 Python 环境路径。执行 which python3 获取解释器绝对路径,避免使用相对路径。

第二步:创建 service 文件。在 /etc/systemd/system/ 目录下新建文件,文件名必须以 .service 结尾。

第三步:配置关键参数。ExecStart 必须写绝对路径,User 指定运行用户,WorkingDirectory 指定脚本所在目录。

第四步:重载并启用。修改配置后必须执行 systemctl daemon-reload,否则 systemd 不会识别新文件。

如何编写 systemd service 文件实现开机自启 Python 脚本

怎么验证是否生效

执行 systemctl status myscript.service 查看状态,显示 active (running) 表示服务正常。

查看日志输出执行 journalctl -u myscript.service -f,确认脚本打印信息是否正常出现。

重启服务器后,再次检查服务状态,确认开机自启生效。

常见坑

路径错误:ExecStart 中 Python 或脚本路径不是绝对路径,导致服务启动失败。

环境变量缺失:systemd 服务默认环境变量较少,脚本中依赖的环境变量需在 service 文件中通过 Environment 指定。

如何编写 systemd service 文件实现开机自启 Python 脚本

权限不足:运行用户没有脚本执行权限或写入日志目录的权限,需检查文件归属和 chmod 设置。

虚拟环境未激活:如果使用 venv,ExecStart 应直接指向 venv 中的 python 解释器路径,而不是 source activate。

常见问题

脚本崩溃后会自动重启吗?

需要在 [Service] 段配置 Restart=alwaysRestart=on-failure,否则默认不会自动重启。

如何在 service 中设置环境变量?

在 [Service] 段使用 Environment="KEY=VALUE" 格式添加,多变量可写多行。

为什么脚本找不到模块?

systemd 环境可能未加载用户 Profile,建议在 ExecStart 中使用虚拟环境的 python 路径或指定 PYTHONPATH。