← 回到手记
代码

用 systemd 跑 Python 小服务的几点心得

让 Python 服务开机自启、崩溃自拉、日志可查,其实不需要 PM2 和 Supervisor,系统自带的 systemd 就够。

跑几个 Python 小服务,其实不一定要装进程守护工具,systemd 几行配置就够了。

一个够用的 unit 模板

[Unit]
Description=My App
After=network.target

[Service]
WorkingDirectory=/opt/myapp
EnvironmentFile=/etc/myapp.env
ExecStart=/opt/myapp/venv/bin/gunicorn -b 127.0.0.1:8000 wsgi:app
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

几条实践心得

  • Restart=always:进程崩了 3 秒后自动拉起,半夜也能睡个好觉。
  • EnvironmentFile:密钥和路径放独立的环境文件里,权限设为 600,不混在代码仓库。
  • 虚拟环境写绝对路径:/opt/myapp/venv/bin/gunicorn,避免环境变量带来的意外。
  • 日志交给 journal:应用只管往 stdout 打日志,用 journalctl -u myapp -f 查看,不用自己折腾日志轮转。
  • 改完记得两连:systemctl daemon-reload 然后 restart,多数"怎么没生效"都卡在第一句。

顺手加一层保护

如果是长期跑的服务,可以再加几句加固:

NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/var/lib/myapp

文件系统只开放真正需要写的目录,出了问题也能少疼一点。

工具不在多,在于用透。systemd 这类"自带"的东西,往往是被低估的那一个。

✳

谢谢你读到这里。