Linux健康检查脚本需围绕“可执行、可判断、可告警、可记录”设计,涵盖CPU、内存、磁盘、服务状态、日志异常5–8个核心维度,用标准命令轻量检测,配合cron定时运行并加锁防并发。

在 Linux 中编写自动化健康检查脚本,核心是围绕“可执行、可判断、可告警、可记录”四个目标设计:用 Shell 脚本定期采集关键指标(CPU、内存、磁盘、服务状态、日志异常等),通过简单条件判断触发响应(如发邮件、写日志、重启服务),再配合 cron 实现定时运行。
明确要检查的关键项
别一上来就写代码,先列出现网最需关注的 5–8 个健康维度,例如:
- CPU 使用率是否持续高于 90%(取 5 分钟均值)
- 内存剩余是否低于 512MB 或使用率超 95%
- /、/var、/home 对应的磁盘使用率是否 ≥ 90%
- 关键服务(如 nginx、mysql、sshd)是否仍在运行且端口可连
- /var/log/messages 或应用日志中最近 10 分钟是否出现 “ERROR”、“OOM killed”、“connection refused” 等关键词
用标准命令组合做轻量检测
避免引入复杂依赖,优先使用系统自带命令拼接逻辑:
- 查 CPU:用 top -bn1 | grep '%Cpu' | awk '{print $2}' | cut -d'%' -f1 获取当前空闲率,反推使用率
- 查内存:用 free -m | awk '/Mem:/ {print $4}' 取可用内存(MB),或 awk '/Mem:/ {printf "%.0f", $3/$2*100}' 算使用率
- 查磁盘:用 df -h | awk '$5 ~ /[0-9]+%/ && substr($5,1,length($5)-1) >= 90 {print $1,$5}'
- 查服务:用 systemctl is-active nginx && ss -tln | grep ':80' > /dev/null 组合验证状态+端口
- 查日志:用 journalctl -S "10 minutes ago" | grep -i "error\|failed\|killed" | tail -5
脚本结构建议:检测 → 判断 → 动作
一个清晰的脚本骨架示例如下(保存为 /opt/bin/health_check.sh):
#!/bin/bash
LOGFILE="/var/log/health_check.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
<h1>检测磁盘</h1><p>disk_warn=$(df -h | awk '$5 ~ /[0-9]+%/ && substr($5,1,length($5)-1) >= 90 {print $1,$5}')
if [ -n "$disk_warn" ]; then
echo "[$DATE] DISK WARNING: $disk_warn" | tee -a $LOGFILE
echo "$disk_warn" | mail -s "ALERT: Disk Full on $(hostname)" admin@example.com
fi</p><h1>检测 MySQL 服务</h1><p>if ! systemctl is-active --quiet mysql; then
echo "[$DATE] MYSQL DOWN — restarting..." | tee -a $LOGFILE
systemctl restart mysql 2>&1 | tee -a $LOGFILE
fi
注意:加 #!/bin/bash 头;所有命令路径用绝对路径(如 /usr/bin/mail)更稳妥;tee -a 同时输出到屏幕和日志;用 systemctl is-active --quiet 静默判断,不打印多余信息。
接入定时与最小化运维干扰
把脚本加入 cron,但别直接每分钟跑:
- 日常健康检查设为每 5 分钟一次:*/5 * * * * /bin/bash /opt/bin/health_check.sh > /dev/null 2>&1
- 避免并发:可在脚本开头加锁机制,例如 if [ -f /tmp/health_check.lock ]; then exit; else touch /tmp/health_check.lock; trap 'rm -f /tmp/health_check.lock' EXIT
- 日志轮转:用 logrotate 管理 /var/log/health_check.log,或脚本内用 logrotate -f /etc/logrotate.d/health_check 触发
- 权限收紧:脚本属主设为 root,权限 chmod 700,避免普通用户误执行或篡改


















