求助:编写Shell脚本实现CentOS 6.2指定PID服务的Cron监控与自动重启
监控指定PID服务并自动重启的Shell脚本方案(CentOS 6.2)
Hey there! 刚接触CentOS 6.2就能自己琢磨监控脚本,已经很棒了😉。针对你遇到的「已知PID但重启环节卡壳」的问题,我给你整理一套完整的实现方案,一步步来:
第一步:编写Shell监控脚本
先写核心逻辑:检查目标PID对应的进程是否存活,若进程消失则自动重启服务。直接复制下面的脚本,替换成你的实际参数即可:
#!/bin/bash # 替换成你要监控的目标PID TARGET_PID="1234" # 替换成服务的实际启动命令,比如service nginx start / /usr/bin/your-service-start START_CMD="/usr/bin/service your_service start" # 日志文件路径,用来记录监控和重启情况 LOG_FILE="/var/log/service_monitor.log" # 检查PID对应的进程是否存在 if ! ps -p $TARGET_PID > /dev/null 2>&1; then echo "$(date '+%Y-%m-%d %H:%M:%S'): PID $TARGET_PID 对应的服务已停止,正在执行重启..." >> $LOG_FILE # 执行重启命令 $START_CMD # 等待5秒后检查重启是否成功 sleep 5 if ps -p $TARGET_PID > /dev/null 2>&1; then echo "$(date '+%Y-%m-%d %H:%M:%S'): 服务重启成功,当前PID仍为 $TARGET_PID" >> $LOG_FILE else echo "$(date '+%Y-%m-%d %H:%M:%S'): 警告!服务重启失败,请手动排查问题!" >> $LOG_FILE fi else echo "$(date '+%Y-%m-%d %H:%M:%S'): PID $TARGET_PID 对应的服务运行正常" >> $LOG_FILE fi
脚本关键逻辑说明
ps -p $TARGET_PID > /dev/null 2>&1:静默检查PID是否存在,只返回状态码,不输出冗余信息- 用
!取反状态码,当进程不存在时触发重启逻辑 - 日志写入
/var/log/service_monitor.log,方便后续排查监控记录
第二步:给脚本添加执行权限
把脚本放到系统可调用的目录(比如/usr/local/bin),然后添加执行权限:
mv service_monitor.sh /usr/local/bin/ chmod +x /usr/local/bin/service_monitor.sh
第三步:配置Cron定时任务
CentOS 6.2用Cron实现定时监控,步骤如下:
- 编辑当前用户的Cron任务(如果需要root权限执行,就加
sudo):
crontab -e
- 添加定时规则,比如每2分钟检查一次(根据你的需求调整频率):
*/2 * * * * /usr/local/bin/service_monitor.sh
Cron格式说明:分 时 日 月 周,*/2表示每2分钟执行一次,改成* * * * *就是每分钟检查一次。
3. 保存退出后,重启Cron服务生效:
service crond restart
重要注意事项
- 如果你的服务重启后PID会变化,固定PID监控可能失效!建议改成通过服务名称监控,把检查逻辑替换成:
CentOS 6.2的if ! service your_service status > /dev/null 2>&1; then # 重启逻辑 fiservice命令支持status参数判断服务状态,这种方式比固定PID更可靠。 - 确保脚本的启动命令有足够权限,比如服务需要root启动,就用
sudo crontab -e配置root用户的Cron任务。 - 定期查看日志
/var/log/service_monitor.log,确认脚本是否正常工作。
内容的提问来源于stack exchange,提问作者Dr.Bradley
相关产品推荐
相关产品推荐

