手把手教你写一个Linux服务器进程监控脚本

为什么要自己写进程监控脚本

很多新手接手Linux服务器后,最怕关键服务突然挂掉却没人知道。
虽然运维面板(如宝塔)有自带监控,但无法覆盖所有自定义服务,而且你也不能24小时盯着网页。
自己写一个进程监控脚本,搭配定时任务,就能在进程异常时自动发告警或重启,这才是真正“躺平”运维的基础。

准备工作:你需要什么

  • 一台Linux服务器(CentOS 7/8或Ubuntu 20.04+均可)
  • 拥有sudo权限的用户(或者root直接操作)
  • 至少知道要监控的进程名称,比如 nginx、mysql、php-fpm 等
  • 本文使用bash shell,所有系统都默认支持

写一个最小可用的进程监控脚本

在用户家目录下创建脚本文件(比如放在 /root/check_process.sh):

#!/bin/bash
# 进程监控脚本 - 检查指定进程是否存活,如果挂了则执行重启命令

PROCESS_NAME="nginx"                 # 改成你要监控的进程名
RESTART_CMD="systemctl restart nginx" # 重启命令
LOG_FILE="/var/log/process_monitor.log"

# 用 pgrep 判断进程是否存在(-f 表示模糊匹配完整命令行)
if ! pgrep -x "$PROCESS_NAME" > /dev/null 2>&1; then
    echo "$(date) - $PROCESS_NAME 进程未运行,正在重启..." >> "$LOG_FILE"
    $RESTART_CMD
    if [ $? -eq 0 ]; then
        echo "$(date) - 重启成功" >> "$LOG_FILE"
    else
        echo "$(date) - 重启失败,请手动检查" >> "$LOG_FILE"
    fi
else
    echo "$(date) - $PROCESS_NAME 运行正常" >> "$LOG_FILE"
fi

重要说明

  • -x 参数让 pgrep 精确匹配进程名,避免误杀
  • 重启命令根据你服务器实际环境调整,比如宝塔安装的nginx可能需要 /etc/init.d/nginx restart
  • 日志文件路径确保有写入权限,建议先手动创建并赋予 755 权限:touch /var/log/process_monitor.log && chmod 666 /var/log/process_monitor.log

保存文件后添加执行权限:

chmod +x /root/check_process.sh

用crontab定时执行,实现自动监控

编辑当前用户的定时任务:

crontab -e

在最后添加一行,每分钟检查一次(根据需求调整间隔):

* * * * * /root/check_process.sh

保存退出(vim中按 Esc 输入 :wq)。
现在系统每分钟就会运行一次监控脚本。
你可以先手动运行一遍验证:

bash /root/check_process.sh
cat /var/log/process_monitor.log

避坑指南(新手最容易踩的坑)

1. 进程名匹配不上

  • ps aux | grep 进程名 查看实际进程命令行,确认进程名是 nginx 还是 nginx: master process
  • 如果进程名带有空格或路径,建议用 pgrep -f 模糊匹配,但注意不要匹配到自身脚本

2. 脚本执行权限不够

  • crontab中默认用户的环境变量有限,脚本中最好使用绝对路径,比如 /usr/sbin/nginx 而不是 nginx
  • 如果重启命令需要sudo,可以给脚本添加 NOPASSWD 权限:编辑 /etc/sudoers,添加 root ALL=(ALL) NOPASSWD: /usr/sbin/nginx

3. 日志文件过大

  • 日志不会自动轮转,建议加入行数限制或使用 logrotate。快速办法:每月手动清理一次,或者脚本内只保留最近100行:tail -100 $LOG_FILE > $LOG_FILE.tmp && mv $LOG_FILE.tmp $LOG_FILE

4. 重复重启导致资源耗尽

  • 如果进程反复崩溃,每分钟重启一次可能造成服务雪崩。建议在脚本中加入冷却时间:检测距上次重启是否超过5分钟,若没超过则只告警不重启。

效果验证:确认你的监控脚本在干活

手动杀掉被监控进程:

kill $(pgrep nginx)

等待1分钟后检查日志和进程状态:

cat /var/log/process_monitor.log | tail -5
ps aux | grep nginx

如果日志里有“进程未运行,正在重启...重启成功”字样,并且nginx又正常启动了,说明监控脚本生效。
你可以用 crontab -l 确认定时任务已添加。

如果你正在为自己的Linux服务器配置进程监控脚本,建议先按本文步骤完整执行,再根据业务特点调整监控频率、告警方式(比如改成发邮件或钉钉消息)。
遇到异常时优先回看避坑和高频问题部分,基本能解决90%的坑。

分享到:
上一篇
WordPress网站链接提交收录实战
下一篇
Docker部署loki:Docker部署Loki日志系统
1
系统公告

泽御云五一特惠活动🔥

泽御云持证合规运营,资质齐全可查,长久稳定! 五一限时多重福利同步开启: ✅ 香港 2 核 2G 云服务器超值拼团,低价入手团长免费 ✅ 4 核 4G 多机房年付拼团,性价比拉满 ✅ 内蒙古新区限时 7 折(zeyuyunnmg)特惠,专属优惠码锁价续费 ✅ 全站通用 75 折优惠,老用户充值享专属赠金 官方站点:zeyuyun.com 合规资质齐全|售后有保障|活动限时错过不再有
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意