Linux 监控管理工具:打造你的自动化监控脚本库摘要:在Linux系统的日常运维工作中,我们常常需要时刻关注服务器的健康状况。虽然市面上有 Zabbix、Prometheus 等专业监控工具,但对于一些轻量级需求或特定场景,编写几个简单高效的 Shell 脚本往往能更快速地解决问题。
通过 Shell 脚本,我们可以实现系统负载监控、服务状态检查、磁盘空间预警、网络连通性测试以及日志自动清理等功能。一旦发现问题,脚本能立即通过邮件通知管理员,让我们从繁琐的重复检查中解放出来。
详细内容请查阅下文。
一、准备工作:配置邮件报警服务
在开始编写脚本之前,我们需要先打通“报警”这一环。如果服务器发现问题却无法通知到人,那自动化就失去了意义。这里我们使用 mailx 配合 SMTP 服务来实现邮件发送功能。1. 安装邮件服务工具
# yum -y install mailx
2. 配置 SMTP 认证信息
编辑 /etc/mail.rc 文件,在文件末尾添加你的邮箱 SMTP 配置。这里以 163 邮箱为例(实际工作中建议使用企业邮箱或专门的报警邮箱):备注:详细事项说明如下
3. 发送测试邮件
测试指令#echo "这是一封来自Linux服务器的测试邮件" | mail -s "系统报警测试"17587257@qq.com测试结果如下
二、实战案例:Linux监控管理工具
1.系统负载监控脚本:防止服务器“过劳死”
系统负载(Load Average)是衡量服务器繁忙程度的重要指标。但很多初学者容易忽略一个关键点:负载的高低是相对于 CPU 核心数而言的。原脚本虽然提到了核心数,但在实际计算阈值时,我们通常认为单核负载超过 1.0 就是满载。对于多核 CPU,合理的报警阈值应该是 CPU核心数 * 1.5 左右(允许一定的缓冲)。#!/bin/bash1. 获取 CPU 核心数CORES=$(grep 'model name' /proc/cpuinfo | wc -l)2. 设定报警阈值 (核心数 * 1.5)THRESHOLD=$(echo "$CORES * 1.5" | bc)3. 获取当前 1 分钟负载值,并用 tr 命令删除逗号#uptime 输出的负载值带有逗号,例如 "0.01,",需要处理成 "0.01"LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | tr -d ',')4. 比较并报警CHECK=$(echo "$LOAD > $THRESHOLD" | bc)if [ $CHECK -eq 1 ]; thenMESSAGE="警告:服务器负载过高!当前负载:$LOAD,阈值: $THRESHOLD,CPU核心数: $CORES"echo$MESSAGE | mail -s "【严重】系统负载报警" 17587257@qq.comecho"已发送报警邮件: $MESSAGE"elseecho"系统负载正常: $LOAD (阈值: $THRESHOLD)"fi
测试结果如下
2.服务状态监控脚本:确保关键业务在线
服务器跑得再快,如果关键服务(如 Nginx、MySQL、Docker)挂了也是白搭。我们需要一个脚本来充当“看门狗”。原脚本使用 systemctl is-active,这是很好的做法。但在实际运维中,我们往往需要监控多个服务。我们可以将服务名作为参数传入,或者在脚本中定义一个服务列表。#!/bin/bash定义需要监控的关键服务列表SERVICES=("sshd" "nginx" "mysqld" "docker")for SERVICE in "${SERVICES[@]}"; do#检查服务是否处于 active (running) 状态#--quiet 参数表示不输出任何信息,只通过返回值判断systemctlis-active --quiet "$SERVICE"if[ $? -ne 0 ]; then#如果返回值不为 0,说明服务未运行MSG="错误:关键服务[$SERVICE] 已停止运行!请立即检查!"echo$MSG | mail -s "【紧急】服务宕机报警" 17587257@qq.comecho"发送报警: $SERVICE 停止运行"#进阶技巧:可以尝试自动重启服务#systemctl start $SERVICEelseecho"服务 [$SERVICE] 运行正常。"fidone
测试结果如下
3.磁盘空间监控脚本:拒绝“磁盘已满”尴尬
磁盘空间不足是导致系统故障的常见原因。我们需要监控磁盘使用率,并在达到警戒线(如 85%)时报警。原脚本逻辑基本正确,但需要过滤掉 tmpfs 等虚拟文件系统,只关注物理磁盘或主要挂载点。同时,df 命令的输出格式在不同系统可能略有差异,使用 df -P (POSIX标准) 可以保证输出格式统一,便于 awk 处理。#!/bin/bash设定阈值,例如 85%THRESHOLD=85使用 df -P 获取标准格式输出,并排除 tmpfs 和 devtmpfsdf -P | grep -vE "tmpfs|devtmpfs|Filesystem" | awk '{print $1" "$5" "$6}' | while read OUTPUT;do#解析输出DEVICE=$(echo$OUTPUT | awk '{print $1}')PERCENT=$(echo$OUTPUT | awk '{print $2}' | tr -d '%')MOUNT_POINT=$(echo$OUTPUT | awk '{print $3}')#判断是否超过阈值if[ $PERCENT -ge $THRESHOLD ]; thenMSG="警告:磁盘空间不足!分区:$MOUNT_POINT ($DEVICE) 使用率已达 ${PERCENT}%"echo$MSG | mail -s "【警告】磁盘空间报警" 17587257@qq.comecho"发送报警: $MSG"elseecho"磁盘 $MOUNT_POINT 使用正常: ${PERCENT}%"fidone
测试结果如下
4.网络连通性监控:充当“网络探针”
有时候服务器本身没挂,但网络断了,或者依赖的下游服务(如 API 接口、数据库端口)无法访问。使用 ping 命令时,必须加上 -c (次数) 和 -W (超时时间) 参数,否则脚本会一直卡在那里等待响应,导致自动化任务无法继续。#!/bin/bash目标 IP 或域名(可以是网关,也可以是外部可靠地址如 8.8.8.8 或百度)TARGET_IP="www.baidu.com"发送 3 个包,每个包等待 2 秒ping -c 3 -W 2 $TARGET_IP > /dev/null 2>&1if [ $? -ne 0 ]; thenMSG="严重:服务器无法连接外网!目标地址$TARGET_IP 无响应。"echo$MSG | mail -s "【紧急】网络连通性报警" 17587257@qq.comecho"发送报警: 网络不通"elseecho"网络连接正常,可以访问 $TARGET_IP"fi
测试结果如下
5.日志自动清理脚本:释放存储空间
日志文件(如 /var/log 下的文件)会随着时间推移无限增长,占用宝贵的磁盘空间。使用 find 命令查找并删除旧文件是标准做法。但为了安全起见,建议先用 echo 打印出要删除的文件,确认无误后再执行 rm。此外,-mtime +30 表示修改时间在 30 天前的文件。实战脚本:clean_logs.sh
#!/bin/bash日志目录LOG_DIR="/var/log"保留天数DAYS_TO_KEEP=30echo "开始清理 $LOG_DIR 下 $DAYS_TO_KEEP 天前的日志..."查找并删除 .log 结尾的文件注意:生产环境操作 rm 务必小心,建议先测试find $LOG_DIR -name "*.log" -type f -mtime +$DAYS_TO_KEEP -exec rm -rf {} \;也可以清理一些特定的旧压缩包find $LOG_DIR -name "*.gz" -type f -mtime +$DAYS_TO_KEEP -exec rm -rf {} \;echo "清理完成。"
测试结果如下
6. 进阶:让脚本自动运行
写好脚本后,手动执行太麻烦。我们需要利用 Linux 的 crontab 计划任务,让它们自动跑起来。每 5 分钟检查一次负载*/5 * * * * /bin/bash /root/scripts/check_load.sh每 10 分钟检查一次磁盘*/10 * * * * /bin/bash /root/scripts/check_disk.sh每 1 分钟检查一次关键服务(服务宕机需尽快发现)* * * * * /bin/bash /root/scripts/check_service.sh每天凌晨 3 点清理日志0 3 * * * /bin/bash /root/scripts/clean_logs.sh
设置结果如下
三、经验总结
通过上述几个脚本,我们构建了一个基础的 Linux 自动化运维体系。这些脚本虽然简单,但涵盖了系统运维中最核心的“监、管、控”三个环节:在实际工作中,你可以根据业务需求,将这些脚本进一步封装,甚至结合 Python语言开发更复杂的监控平台。但万变不离其宗,掌握这些 Shell 基础,永远是 Linux 运维管理工作的基石。总而言之,通过不断练习这些命令,你将能体会到 Vim 带来的高效与便捷,真正成为 Linux 环境下的高手。
如果本文对您有帮助,欢迎:
3.🔄转发,在Linux系统中设计打造你自己的自动化监控脚本提高团队的工作效率。