最常用、最可靠的方式是使用 systemd 服务管理机制;它原生支持进程存活检测、崩溃重启、依赖管理与日志集成,比手动轮询脚本更健壮且符合 linux 规范。

在 Linux 系统中,监控关键进程并自动拉起,最常用、最可靠的方式是使用 systemd 服务管理机制,而非传统轮询脚本。它原生支持进程存活检测、崩溃重启、依赖管理与日志集成,比手动写 while 循环 + ps/grep 更健壮、更符合 Linux 生态规范。
用 systemd 服务实现进程守护(推荐)
以守护一个名为 myapp 的二进制程序为例(如 /opt/myapp/server):
- 创建服务单元文件:sudo vim /etc/systemd/system/myapp.service
- 填入以下内容(关键字段已注释):
[Unit] Description=My Application Service After=network.target <p>[Service] Type=simple User=myuser WorkingDirectory=/opt/myapp ExecStart=/opt/myapp/server --config /opt/myapp/config.yaml Restart=always RestartSec=3 StartLimitInterval=0</p><h1>防止频繁崩溃后被 systemd 限制重启</h1><p>KillSignal=SIGTERM TimeoutStopSec=10</p><p>[Install] WantedBy=multi-user.target</p>
说明:
- Restart=always:进程退出(无论是否异常)都会自动重启
- RestartSec=3:重启前等待 3 秒,避免风暴式启动
- StartLimitInterval=0:禁用启动频率限制(生产环境建议设为 60 并配合 StartLimitBurst)
- 启用服务:sudo systemctl daemon-reload && sudo systemctl enable --now myapp
补充:需要额外健康检查时加 ExecStartPre 或自定义 watchdog
若进程“活着但不响应”,systemd 默认只看进程是否存在。此时可:
- 在启动前加预检(如端口未被占用):
ExecStartPre=/bin/sh -c 'lsof -i :8080 > /dev/null || exit 0' - 或用 WatchdogSec + 应用内上报(需应用支持 sd_notify):
设置 WatchdogSec=30s,并在程序中每 25 秒调用 systemd-notify --watchdog - 或写一个独立的健康检查服务(如每 10 秒 curl 健康接口),失败时触发 systemctl restart myapp
传统脚本方式(仅作兼容或简单场景)
如果必须用 shell 脚本(如旧系统无 systemd),可写一个轻量监控器:
- 保存为 /usr/local/bin/monitor-myapp.sh:
#!/bin/bash PROC_NAME="server" BIN_PATH="/opt/myapp/server" CONFIG_PATH="/opt/myapp/config.yaml" <p>while true; do if ! pgrep -f "$BIN_PATH" > /dev/null; then echo "$(date): $PROC_NAME not running, restarting..." | logger -t monitor nohup $BIN_PATH --config $CONFIG_PATH > /dev/null 2>&1 & fi sleep 10 done</p>
- 赋予执行权限:chmod +x /usr/local/bin/monitor-myapp.sh
- 用 systemd 或 crontab 启动该脚本(推荐 systemd 封装一层,确保开机运行)
- ⚠️ 注意:避免用 ps | grep 匹配,易误判;优先用 pgrep -f 或匹配 PID 文件
验证与日常维护
无论哪种方式,都要做这几件事:
- 查看状态:systemctl status myapp
- 查看实时日志:journalctl -u myapp -f
- 手动停止测试自动恢复:sudo systemctl stop myapp → 观察是否几秒内重启
- 模拟崩溃(如 kill -9 主进程 PID),确认 Restart 策略生效











