手把手教你写一个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%的坑。