监控脚本核心是定义查什么、怎么查、查完做什么、何时查,用shell实现需逻辑清晰、容错到位、结果可追溯;服务列表只含nginx、mysql、redis-server、myapp.service等强依赖项,统一用systemctl is-active判断状态,加timeout防卡死,日志落盘+logger告警+邮件通知,cron每5分钟执行并设chmod+x与set -e/-u保障健壮性。

用监控脚本定时检查服务,核心是“定义要查什么、怎么查、查完做什么、什么时候查”。不依赖复杂平台,纯 Shell 就能落地,关键在逻辑清晰、容错到位、结果可追溯。
明确要监控的服务列表
别查所有服务,只盯业务强依赖的核心项。比如 Nginx、MySQL、Redis、你的应用服务名(如 myapp.service)。服务名必须和 systemctl list-units 输出一致——注意不是 redis 而是 redis-server,不是 java 而是具体服务单元名。
- 写进脚本数组:
services=("nginx" "mysql" "redis-server" "myapp.service") - 或从外部文件读取,方便统一维护:
services=($(cat /etc/monitor/services.list)) - 非 systemd 管理的进程(如自启脚本),可用
pgrep -f "java -jar app.jar"辅助确认
统一用 systemctl 判断真实状态
systemctl is-active 比 ps 或 netstat 更可靠:它识别 active、failed、inactive 等完整状态,避免误判残留进程或端口被占。
- 判断逻辑示例:
if systemctl is-active --quiet "$svc"; then echo "$svc: OK"; else echo "$svc: FAILED"; fi - 加超时保护,防卡死:
timeout 8 systemctl is-active "$svc" 2>/dev/null || echo "$svc: TIMEOUT" - 对无 systemd 的轻量环境,先检测命令是否存在:
command -v systemctl >/dev/null || { echo "systemctl not found"; exit 1; }
记录日志并触发基础告警
巡检结果不能只打印在终端,要落盘可查,异常时及时通知。
- 追加时间戳日志:
echo "$(date '+%F %T'): $svc → $(systemctl is-active "$svc" 2>/dev/null)" >> /var/log/monitor.log - 发现异常立刻记录系统日志:
logger -t monitor "CRITICAL: $svc is $state" - 简单邮件告警(需已配置 mail 工具):
echo "ALERT: $svc down at $(date)" | mail -s "Service Down" admin@local
用 cron 定时执行并确保脚本健壮
让脚本稳定跑起来,得兼顾权限、错误中断和执行环境。
- 脚本开头加防护:
#!/bin/bash+set -e(出错退出)+set -u(未定义变量报错) - cron 示例(每 5 分钟执行):
*/5 * * * * /opt/bin/check-services.sh >/dev/null 2>&1 - 确保脚本有执行权限:
chmod +x /opt/bin/check-services.sh - 测试时手动运行一次,再等几分钟看日志是否生成、异常是否触发,验证逻辑闭环











