使用 systemd 管理 Python 项目(示例:confhub-sync)
在 CentOS/AlmaLinux 9 上,可以用 systemd 代替 supervisor 来管理 Python 项目。下面是我配置的 myapp-confhub-sync.service 示例,路径按实际环境调整。
配置文件:
/etc/systemd/system/myapp-confhub-sync.service
[Unit]
Description=MyApp - confhub-sync (Python, conda py312)
After=network-online.target
Wants=network-online.target# ——启动风暴抑制(在 [Unit] 段生效)——
# StartLimitIntervalSec:统计窗口(这里 30 秒内)
# StartLimitBurst:窗口内允许的“自动重启/失败启动”次数上限
# 超过则进入抑制,直到窗口过期或手动 reset-failed
StartLimitIntervalSec=30s
StartLimitBurst=5[Service]
# ——运行目录 & 环境——
WorkingDirectory=/opt/genesis/confhub-sync
EnvironmentFile=-/opt/genesis/confhub-sync/.env
Environment=PYTHONUNBUFFERED=1
# 将 env 的 bin 置于 PATH 前,便于子进程用到该环境内的可执行文件
Environment=PATH=/opt/anaconda3/envs/py312/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin# ——启动命令——
ExecStart=/opt/anaconda3/envs/py312/bin/python /opt/genesis/confhub-sync/__main__.py# ——进程管理策略——
# Restart 的可选值:
# no → 不自动重启(默认)
# always → 无论正常/异常退出都重启
# on-success → 仅正常退出 (code=0) 时重启
# on-failure → (推荐)异常退出、信号终止、超时等失败场景重启
# on-abnormal → 仅异常信号导致退出时重启
# on-abort → 仅“非正常信号”导致退出时重启(不含 TERM/INT)
# on-watchdog → 仅看门狗超时触发(需 WatchdogSec 配合)
Restart=no# RestartSec:发生重启时,等待多久再拉起(对 Restart=no 无效)
RestartSec=2s# TimeoutStopSec:执行 `systemctl stop` 时,先发 SIGTERM;
# 若超时未退出,则发 SIGKILL 强制杀掉。
TimeoutStopSec=20s# ——安全/隔离选项——
NoNewPrivileges=true # 禁止进程获取更高权限
PrivateTmp=true # 给进程单独的 /tmp
ProtectSystem=full # 根目录大部分只读
ProtectHome=false # 如需访问 /root/.ssh,设为 false,否则建议设为 true
Environment=HOME=/root
ReadWritePaths=/opt/genesis/confhub-sync # 允许写入的白名单目录# ——日志——
# 默认 stdout/stderr 进入 journald(可配置持久化+限额)
# 如需对日志节流可启用:
# LogRateLimitIntervalSec=30s
# LogRateLimitBurst=200[Install]
WantedBy=multi-user.target
常用操作
# 保存文件后刷新 systemd
systemctl daemon-reload# 启动服务
systemctl start myapp-confhub-sync.service# 设置开机自启
systemctl enable myapp-confhub-sync.service# 查看服务状态
systemctl status myapp-confhub-sync.service --no-pager# 查看日志(精确到毫秒,实时跟随)
journalctl -u myapp-confhub-sync.service -o short-precise -f
小结
-
这种方式比 supervisor 更轻量,直接依托 systemd。
-
日志统一进入 journald,可以设置持久化和限额。
-
Restart 策略灵活,能实现和 supervisor 类似的守护功能。
-
结合 SELinux 正确标签(restorecon -RFv /opt/...),可以在 Enforcing 模式下稳定运行。
要不要我再帮你整理一份 “最小精简版”配置(只保留必要选项,适合博客里快速复制粘贴的)?