在 Linux 系统中,使用 systemctl 来管理 Python 应用程序(如 Web 服务、后台脚本等)是一种最佳实践,它可以让你的 Python 应用像系统服务一样开机自启、崩溃后自动重启、日志集中管理等。
以下是完整的操作指南,包括如何创建 .service 文件、配置参数以及常用命令。
创建 systemd 服务文件
假设你的 Python 项目位于 /opt/myapp,主程序是 main.py,虚拟环境在 /opt/myapp/venv。
步骤 1:创建服务文件
使用文本编辑器创建一个新的服务文件,/etc/systemd/system/myapp.service:
sudo nano /etc/systemd/system/myapp.service
步骤 2:写入配置内容
以下是一个标准的配置模板,请根据你的实际路径修改:
[Unit] Description=My Python Application After=network.target [Service] # 运行用户(建议不要使用 root,创建一个专用用户如 myappuser) User=myappuser Group=myappuser # 工作目录 WorkingDirectory=/opt/myapp # 启动命令:使用虚拟环境中的 Python 解释器 ExecStart=/opt/myapp/venv/bin/python /opt/myapp/main.py # 重启策略:如果程序崩溃,自动重启 Restart=on-failure # 重启前等待时间(秒) RestartSec=5 # 日志输出 StandardOutput=journal StandardError=journal # 可选:设置环境变量 Environment="PYTHONUNBUFFERED=1" Environment="APP_ENV=production" [Install] WantedBy=multi-user.target
注意:
ExecStart必须使用虚拟环境中 Python 的绝对路径。User和Group建议指定一个非 root 用户,以提高安全性。PYTHONUNBUFFERED=1可以确保 Python 日志立即输出到 systemd 日志中,而不是被缓冲。
常用 systemctl 命令
创建或修改服务文件后,需要重新加载 systemd 配置,然后启用并启动服务。
重新加载配置
每次修改 .service 文件后,必须执行:
sudo systemctl daemon-reload
启动服务
sudo systemctl start myapp.service
设置开机自启
sudo systemctl enable myapp.service
停止服务
sudo systemctl stop myapp.service
重启服务
sudo systemctl restart myapp.service
查看服务状态
sudo systemctl status myapp.service
如果服务正常运行,你会看到 active (running) 字样。
查看日志
systemd 会捕获标准输出和标准错误,你可以使用 journalctl 查看日志:
查看实时日志
sudo journalctl -u myapp.service -f
查看最近 100 行日志
sudo journalctl -u myapp.service -n 100
查看特定时间段的日志
sudo journalctl -u myapp.service --since "2026-10-01 09:00:00" --until "2026-10-01 18:00:00"
高级配置建议
使用 Gunicorn/uWSGI 托管 Web 应用
如果你的 Python 应用是 Web 应用(如 Flask/Django),建议使用 Gunicorn 或 uWSGI 作为进程管理器,而不是直接运行 python main.py。
示例(Gunicorn):
[Service] ExecStart=/opt/myapp/venv/bin/gunicorn --workers 3 --bind unix:/opt/myapp/myapp.sock myapp:app
限制资源使用
防止 Python 应用占用过多内存或 CPU:
[Service] MemoryMax=512M CPUQuota=50%
日志轮转(Log Rotation)
systemd 默认会管理日志大小,你可以在 /etc/systemd/journald.conf 中配置:
[Journal] SystemMaxUse=100M
常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 服务启动后立即停止 | 程序退出或报错 | 使用 journalctl -u myapp.service -xe 查看详细错误 |
| 权限拒绝 | 文件权限不足或用户无权限 | 确保 User 有权限访问 WorkingDirectory 和文件 |
| 找不到 Python | 路径错误 | 检查 ExecStart 中的 Python 路径是否正确 |
| 环境变量未生效 | 未在 [Service] 中设置 |
使用 Environment="KEY=VALUE" 或 EnvironmentFile=/path/to/env |
完整示例:Flask 应用
假设你有一个 Flask 应用,结构如下:
/opt/myflaskapp/
├── venv/
├── app.py
└── myflaskapp.service
服务文件 /etc/systemd/system/myflaskapp.service:
[Unit] Description=Flask Application After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/opt/myflaskapp Environment="PATH=/opt/myflaskapp/venv/bin" ExecStart=/opt/myflaskapp/venv/bin/gunicorn --workers 2 --bind unix:myflaskapp.sock app:app Restart=always [Install] WantedBy=multi-user.target
启用并启动:
sudo systemctl daemon-reload sudo systemctl enable myflaskapp sudo systemctl start myflaskapp sudo systemctl status myflaskapp
通过以上步骤,你可以将 Python 应用稳定地运行在 Linux 系统中,并享受 systemd 带来的自动重启、日志管理和开机自启功能。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/487461.html



