给 Python 服务配个看门狗:systemd 开机自启与崩溃自愈实战

举报
yd_61455462 发表于 2026/10/27 19:21:57 2026/10/27
【摘要】 很多同学把 Python 服务跑在云服务器上,习惯用 nohup python app.py & 挂在后台:进程一崩没人管,机器一重启服务直接消失。其实用 systemd 花五分钟配置,就能实现开机自启、崩溃自动拉起、日志集中查看。第一步,写 unit 文件 /etc/systemd/system/myapp.service:[Unit]Description=My Python AppAf...

很多同学把 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

几个容易踩的坑:

  1. 相对路径:服务里读配置文件、写日志如果用了相对路径,WorkingDirectory 不填就会找不到文件。
  2. 环境变量:交互式终端里有的环境变量,服务里默认没有,用 Environment= 逐个写明,或用 EnvironmentFile= 指向一个 env 文件。
  3. 端口权限:非 root 用户绑定 80、443 这类低位端口会被拒绝,可以改用高位端口再加一层反向代理,或者给程序加 CAP_NET_BIND_SERVICE 能力。
  4. PYTHONUNBUFFERED=1 别漏:不加的话 print 输出会被缓冲,journalctl 里半天看不到日志,排障时很容易误判。

进阶一点:Restart=always 是任何退出都拉起;如果只想在异常退出时重启,用 Restart=on-failure。再配合 StartLimitBurst 可以限制单位时间内的重启次数,避免程序写错后无限崩溃循环刷日志。

把常驻服务交给 systemd,是单机部署里性价比最高的一步。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。