linux中可用shell脚本+cron实现服务宕机自动拉起:定期检查进程/端口/pid文件/健康接口,确认未运行则启动并记录日志;建议生产环境改用systemd或supervisord等专业工具。

在 Linux 中,用进程监控脚本实现服务宕机自动拉起,核心思路是:定期检查目标进程是否存在,若未运行则启动它。不依赖复杂工具,纯 Shell 脚本 + cron 即可稳定工作。
确认服务的可检测特征
自动拉起的前提是能准确判断服务是否“真正运行”。不能只看进程名,要结合端口、PID 文件或健康接口:
- 查端口:如 Nginx 默认监听 80 端口,可用
ss -tln | grep ':80'或lsof -i :80 - 查进程:用
pgrep -f "nginx"比ps aux | grep nginx更可靠(避免匹配到 grep 自身) - 查 PID 文件:如
/var/run/nginx.pid存在且对应进程存活,才认为正常 - 调用健康接口:对 Web 服务,可用
curl -s --head http://127.0.0.1/health | head -1 | grep "200 OK"
编写轻量级监控脚本
保存为 /opt/bin/monitor-service.sh,赋予执行权限:chmod +x /opt/bin/monitor-service.sh
示例(监控 Redis):
#!/bin/bash SERVICE_NAME="redis-server" PID_FILE="/var/run/redis/redis-server.pid" CHECK_CMD="pgrep -f '$SERVICE_NAME' > /dev/null" <p>if ! $CHECK_CMD; then echo "$(date): $SERVICE_NAME not running, restarting..." >> /var/log/monitor.log if [ -f "$PID_FILE" ]; then rm -f "$PID_FILE" fi systemctl start redis-server 2>/dev/null || /usr/bin/redis-server /etc/redis/redis.conf & fi </p>
说明:
- 优先用
systemctl start启动,确保符合系统服务规范;若无 systemd,则用绝对路径启动二进制 - 记录日志便于排查,不要直接用
echo输出到终端 - 清理残留 PID 文件,避免下次误判
用 cron 定时触发检查
运行 crontab -e,添加一行(每 30 秒太频繁,建议每 1–2 分钟):
*/2 * * * * /opt/bin/monitor-service.sh
注意:
- cron 默认 PATH 较窄,脚本中所有命令尽量用绝对路径(如
/usr/bin/pgrep) - 避免脚本并发执行:可在脚本开头加文件锁,例如
if [ -f /tmp/monitor.lock ]; then exit; else touch /tmp/monitor.lock; trap 'rm -f /tmp/monitor.lock' EXIT; - 测试 cron 环境:临时改成
* * * * *并重定向输出,如*/2 * * * * /opt/bin/monitor-service.sh >> /tmp/monitor-test.log 2>&1
更健壮的替代方案(可选)
若服务关键性高,建议用专业工具降低维护成本:
-
systemd 的 Restart=always:在 service 文件中配置
Restart=on-failure或Restart=always,配合RestartSec=5,由系统级守护进程接管 - supervisord:轻量进程管理工具,支持日志重定向、启动超时、失败邮件通知等
- monit:带状态检查、资源监控、Web 管理界面,适合多服务统一监管
脚本方案简单直接,适合快速上线和学习原理;生产环境关键服务建议迁移到 systemd 或 supervisord。











