linux进程监控脚本需实现“检测+响应+定时触发”闭环:用pgrep/端口/http探活精准检测,优雅重启或安全杀进程并记录日志,crontab每2分钟调度并重定向输出,生产环境推荐systemd timer替代。

Linux中通过脚本定时检查进程状态,核心是“检测 + 响应 + 定时触发”三步闭环。重点不在写多复杂的脚本,而在于检测逻辑可靠、执行环境可控、调度机制稳定。
一、编写可靠的进程状态检测脚本
检测脚本要避免误判,关键在精准识别目标进程是否存在且健康:
- 用 pgrep -f 或 ps aux | grep -v grep | grep 匹配完整命令行(如含路径或参数),比只匹配进程名更准确
- 检查监听端口是否活跃(如 netstat -tlnp | grep :8080 或 ss -tlnp | grep :8080),适合 Web 类服务
- 补充 HTTP 探活(如 curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health),确认服务真正可响应
- 脚本开头显式声明解释器和路径:#!/bin/bash,并设置必要环境变量(如 PATH=/usr/local/bin:/usr/bin:/bin)
- 所有命令使用绝对路径(如 /bin/ps、/usr/bin/curl),避免 crontab 环境中找不到命令
二、为异常进程设计自动响应逻辑
发现进程异常后,脚本需安全执行恢复动作,不能引发二次故障:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 先尝试优雅重启:调用服务自身的 restart 脚本(如 /usr/local/tomcat/bin/shutdown.sh && sleep 5 && /usr/local/tomcat/bin/startup.sh)
- 若无标准脚本,可用 kill -15 $PID 发送 TERM 信号,等待几秒后用 kill -9 $PID 强制终止残留进程
- 每次操作记录日志,包含时间、检测结果、执行动作、返回码,例如:echo "$(date): Tomcat not found, starting..." >> /var/log/process-monitor.log
- 加入防重入机制(如创建锁文件),避免同一时间多个实例并发执行造成冲突
三、用 crontab 稳定调度脚本执行
crontab 是最常用也最容易出错的调度方式,必须验证三个前提:
- 确认 cron 服务正在运行:systemctl status cron(Debian/Ubuntu)或 systemctl status crond(RHEL/CentOS)
- 用 crontab -e 编辑当前用户任务,保存后立即执行 crontab -l 核对内容是否写入成功
- 推荐最小粒度设为每2分钟一次(*/2 * * * * /path/to/check.sh >> /var/log/check.log 2>&1),太频繁易增加负载,太宽松可能错过故障窗口
- 务必重定向输出:>> 日志路径 2>&1,否则失败时看不到任何线索
- 如果脚本需 root 权限(如杀其他用户进程),用 sudo crontab -e 编辑 root 的 crontab,不要在普通用户 crontab 里加 sudo
四、替代方案:systemd timer 更适合长期运维
对于生产环境,systemd timer 比 crontab 更健壮,支持依赖管理、失败计数、精确启动控制:
- 写一个 .service 文件定义要执行的脚本,再配一个同名 .timer 文件定义触发规则(如 OnUnitActiveSec=60 实现每分钟执行)
- 启用后用 systemctl daemon-reload && systemctl enable --now your-check.timer 启动
- 查看状态:systemctl list-timers,查日志:journalctl -u your-check.service -n 50
- 优势在于能自动处理脚本崩溃、阻塞、资源不足等情况,且与系统生命周期深度集成










