Linux服务器巡检需系统覆盖资源、服务、安全、日志四大维度,通过脚本批量采集6项关键指标,分级自动响应异常,并工程化分层管理脚本,同时规避时间不同步、权限硬编码等常见坑。

Linux服务器巡检不是“看看有没有报错”就完事,而是要系统性地覆盖资源、服务、安全、日志四大维度,并通过脚本批量执行、定时固化,才能真正防患于未然。核心在于:可重复、可验证、可追溯。
一、关键指标批量采集:5分钟跑完一台,100台也能一键拉取
用shell脚本+SSH免密+for循环实现多机并行检查,避免逐台登录。重点采集以下6项(每项一行,便于后续grep或导入表格):
- CPU负载:uptime | awk '{print $10,$11,$12}' —— 关注15分钟负载是否持续>CPU核数×0.7
- 内存使用率:free -m | awk '/Mem:/ {printf "%.1f%%", $3/$2*100}' —— 超90%需查进程或swap是否启用
- 根分区使用率:df -h / | awk 'NR==2 {print $5}' —— 超85%触发告警,注意/var/log、/tmp是否异常膨胀
- 关键服务状态:systemctl is-active sshd nginx mysql 2>/dev/null | paste -s -d' ' —— 返回“active active active”才正常
- 最近失败登录:lastb -n 10 2>/dev/null | wc -l —— 非零值需立即查/var/log/secure
- 内核日志错误:dmesg -T | tail -20 | grep -i "error\|fail\|warn" | wc -l —— 不为0时提取完整日志段落
二、自动化处理:发现异常后不只“发邮件”,而是分级响应
巡检结果不能只堆在邮箱里。建议按严重程度自动执行动作:
- 中低风险(如磁盘86%、某服务重启成功):自动清理临时文件(find /tmp -mtime +7 -delete)、重启对应服务(systemctl restart nginx),并记录到巡检日志
- 高风险(如root用户被暴力破解、OOM killer触发、/var/log满):立即封禁可疑IP(iptables -I INPUT -s xxx.xxx.xxx.xxx -j DROP)、压缩归档日志(tar -czf /backup/logs_$(date +%F).tar.gz /var/log/*.log)、发送企业微信/钉钉告警(用curl调用webhook)
- 所有操作必须留痕:每条自动命令前加echo "$(date): [ACTION] 重启nginx" >> /var/log/auto-maintain.log
三、巡检脚本工程化:从“能跑”到“好维护”
别把所有逻辑写在一个.sh里。推荐分层结构:
- config.conf:定义目标主机列表、阈值(DISK_WARN=85)、通知方式、保留日志天数
- check_lib.sh:封装通用函数,如get_cpu_load()、is_service_up()、send_alert()
- main.sh:读配置、遍历主机、调用函数、汇总输出HTML报告(可用echo+cat生成简易表格)
- crontab -e 添加:0 3 * * * /opt/check/main.sh >> /var/log/check_daily.log 2>&1 —— 每天凌晨3点执行
四、避坑指南:这些细节决定巡检是否真有用
很多团队脚本写了却失效,问题常出在:
- 时间同步没做:多台服务器时间差>5分钟,日志分析会错乱 —— 用chronyd统一NTP源
- 权限硬编码:脚本里写root密码或sudo免密,违反最小权限原则 —— 改用专用运维账号+ssh key+sudoers白名单授权特定命令
- 没验证修复效果:自动重启nginx后不curl -I http://localhost检查返回码 —— 加上if ! curl -s -o /dev/null -w "%{http_code}" http://localhost | grep -q "200"; then echo "Restart failed"; fi
- 忽略历史趋势:只看当前值,不存历史数据 —— 每次巡检结果追加到CSV,用gnuplot或Grafana画趋势图,早发现缓慢恶化










