给 Python 服务配个看门狗:systemd 开机自启与崩溃自愈实战
很多同学把 Python 服务跑在云服务器上,习惯用 nohup python app.py & 挂在后台:进程一崩没人管,机器一重启服务直接消失。其实用 systemd 花五分钟配置,就能实现开机自启、崩溃自动拉起、日志集中查看。
第一步,写 unit 文件 /etc/systemd/system/myapp.service:
[Unit]
Description=My Python App
After=network.target
[Service]
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=always
RestartSec=5
Environment=PYTHONUNBUFFERED=1
[Install]
WantedBy=multi-user.target
第二步,启用并启动:
systemctl daemon-reload
systemctl enable --now myapp
第三步,看状态和日志:
systemctl status myapp
journalctl -u myapp -f
几个容易踩的坑:
- 相对路径:服务里读配置文件、写日志如果用了相对路径,WorkingDirectory 不填就会找不到文件。
- 环境变量:交互式终端里有的环境变量,服务里默认没有,用 Environment= 逐个写明,或用 EnvironmentFile= 指向一个 env 文件。
- 端口权限:非 root 用户绑定 80、443 这类低位端口会被拒绝,可以改用高位端口再加一层反向代理,或者给程序加 CAP_NET_BIND_SERVICE 能力。
- PYTHONUNBUFFERED=1 别漏:不加的话 print 输出会被缓冲,journalctl 里半天看不到日志,排障时很容易误判。
进阶一点:Restart=always 是任何退出都拉起;如果只想在异常退出时重启,用 Restart=on-failure。再配合 StartLimitBurst 可以限制单位时间内的重启次数,避免程序写错后无限崩溃循环刷日志。
把常驻服务交给 systemd,是单机部署里性价比最高的一步。
- 点赞
- 收藏
- 关注作者
评论(0)