Linux服务器健康检查Shell脚本:一键生成自动化巡检报告
你的服务器,就像一个忠诚无比、7×24小时为你站岗的“钢铁战士”。它抵御着网络的风风雨-雨,承载着你所有的创意和心血。
但即便是最强悍的战士,也可能会有“亚健康”的时候。它从不抱怨,直到有一天,它可能会因为一个小小的、被我们长期忽视的问题,而轰然倒下。
你,作为它的“指挥官”,真的了解它的健康状况吗?
- 你知道它的“心率”(CPU负载)是否偶尔会飙升到危险的边缘吗?
- 你知道它的“肺活量”(内存)是否因为某个内存泄漏的应用,已经被悄悄地占用了90%吗?
- 你知道它的“粮仓”(硬盘)是否因为日志文件没有及时清理,即将被“撑爆”吗?
我们不可能每天都像个侦探一样,登录到服务器上,敲下一连串的命令去逐项检查。这种重复性的劳动,既浪费时间,也容易遗漏。
今天,我将给你一份“年度体检清单”,并把它变成一个你可以一键执行的自动化Shell脚本。从此,你只需设置一个定时任务,让这个“巡检机器人”每周一的早上,自动为你生成一份图文并茂、重点突出的“服务器健康报告”。你只需花一分钟看一眼这份报告,就能对你这位“钢铁战士”过去一周的健康状况,了如指掌。
Table of Contents
“巡检机器人”的完整代码
别急着去理解每一行代码。先把你的“机器人”领回家。将下面所有的代码,完整地复制,粘贴到你服务器上一个名为health_check.sh的文件里。
Bash
#!/bin/bash# ==============================================================================# Linux 服务器自动化健康巡检脚本## 功能: 生成一份关于系统、CPU、内存、硬盘、网络和进程的综合健康报告。# 使用: 1. 将脚本保存为 health_check.sh# 2. 赋予执行权限: chmod +x health_check.sh# 3. 运行: ./health_check.sh# ==============================================================================# --- 全局颜色定义 ---RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[1;33m'NC='\033[0m' # No Color# --- 阈值定义 ---LOAD_THRESHOLD=10.0 # CPU负载阈值MEM_USAGE_THRESHOLD=90 # 内存使用率阈值 (%)DISK_USAGE_THRESHOLD=90 # 硬盘使用率阈值 (%)# --- 报告头部 ---echo -e "================================================="echo -e " Linux 服务器健康巡检报告"echo -e "================================================="echo -e "报告生成时间: $(date +"%Y-%m-%d %H:%M:%S")"echo ""# --- 1. 系统信息 ---echo -e "${YELLOW}--- 1. 系统信息 ---${NC}"HOSTNAME=$(hostname)OS_VERSION=$(cat /etc/os-release | grep "PRETTY_NAME" | cut -d'"' -f2)KERNEL_VERSION=$(uname -r)UPTIME=$(uptime -p)LAST_REBOOT=$(who -b | awk '{print $3, $4}')echo -e "主机名: ${HOSTNAME}"echo -e "操作系统: ${OS_VERSION}"echo -e "内核版本: ${KERNEL_VERSION}"echo -e "已运行时间: ${UPTIME}"echo -e "上次启动时间: ${LAST_REBOOT}"echo ""# --- 2. CPU 信息 ---echo -e "${YELLOW}--- 2. CPU 信息 ---${NC}"CPU_CORES=$(grep -c ^processor /proc/cpuinfo)LOAD_AVERAGE=$(uptime | awk -F'load average:' '{print $2}')LOAD_1MIN=$(echo ${LOAD_AVERAGE} | awk '{print $1}' | tr -d ',')echo -e "CPU核心数: ${CPU_CORES}"echo -e "平均负载 (1min, 5min, 15min): ${LOAD_AVERAGE}"if (( $(echo "${LOAD_1MIN} > ${LOAD_THRESHOLD}" | bc -l) )); thenecho -e "${RED}[警告] 1分钟内CPU平均负载 (${LOAD_1MIN}) 超过阈值 (${LOAD_THRESHOLD})!${NC}"fiecho ""# --- 3. 内存信息 ---echo -e "${YELLOW}--- 3. 内存信息 ---${NC}"MEM_TOTAL=$(free -h | awk 'NR==2{print $2}')MEM_USED=$(free -h | awk 'NR==2{print $3}')MEM_FREE=$(free -h | awk 'NR==2{print $4}')MEM_USAGE_PERCENT=$(free -m | awk 'NR==2{printf "%.2f", $3*100/$2}')echo -e "总内存: ${MEM_TOTAL}"echo -e "已用内存: ${MEM_USED}"echo -e "可用内存: ${MEM_FREE}"echo -e "内存使用率: ${MEM_USAGE_PERCENT}%"if (( $(echo "${MEM_USAGE_PERCENT} > ${MEM_USAGE_THRESHOLD}" | bc -l) )); thenecho -e "${RED}[警告] 内存使用率 (${MEM_USAGE_PERCENT}%) 超过阈值 (${MEM_USAGE_THRESHOLD}%)!${NC}"fiSWAP_TOTAL=$(free -h | awk 'NR==3{print $2}')SWAP_USED=$(free -h | awk 'NR==3{print $3}')echo -e "Swap总计: ${SWAP_TOTAL}"echo -e "Swap已用: ${SWAP_USED}"echo ""# --- 4. 硬盘空间 ---echo -e "${YELLOW}--- 4. 硬盘空间 ---${NC}"df -hT | awk 'NR>1 {print $0}' | while read -r line; doUSAGE_PERCENT=$(echo ${line} | awk '{print $6}' | tr -d '%')if [[ "${USAGE_PERCENT}" -ge "${DISK_USAGE_THRESHOLD}" ]]; thenecho -e "${RED}${line}${NC}"elseecho -e "${line}"fidoneecho ""# --- 5. 网络信息 ---echo -e "${YELLOW}--- 5. 网络信息 ---${NC}"IP_ADDRESS=$(hostname -I)echo -e "IP 地址: ${IP_ADDRESS}"echo -e "当前监听的端口 (TCP/UDP):"ss -tuln | sed '1d'echo ""# --- 6. 登录用户信息 ---echo -e "${YELLOW}--- 6. 当前登录用户 ---${NC}"whoecho ""# --- 7. 资源消耗TOP 10 ---echo -e "${YELLOW}--- 7. 资源消耗 TOP 10 ---${NC}"echo -e "CPU占用 TOP 10:"ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%cpu | head -n 11echo ""echo -e "内存占用 TOP 10:"ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%mem | head -n 11echo ""# --- 报告尾部 ---echo -e "================================================="echo -e " 报告结束"echo -e "================================================="
解剖“机器人”:它到底在检查什么?
好了,现在我们来逐一解剖这个“机器人”的“大脑”,看看它的每一个检查动作,背后都有什么深意。
- 第一部分:系统信息
- 这是什么? 这是“体检报告”的“个人基本信息”栏。它告诉你这位战士的姓名(主机名)、年龄(已运行时间)、以及它的“身份证号”(操作系统和内核版本)。
- 第二部分:CPU信息 (心脏检查)
- 这是什么? 这里核心是检查
load average(平均负载)。我们用立交桥的比喻解释过,这个值如果持续高于你的CPU核心数,就说明“心脏”压力过大。脚本会自动将当前1分钟的负载与你设定的阈值(默认是10)进行比较,如果超标,会用红色高亮发出警告。
- 这是什么? 这里核心是检查
- 第三部分:内存信息 (肺活量与脑容量检查)
- 这是什么?
free -h命令清晰地展示了你的物理内存和Swap(虚拟内存)的使用情况。脚本会自动计算内存使用率,一旦超过阈值(默认90%),同样会红色高亮警告。内存耗尽,是导致服务崩溃和服务器死机的头号元凶之一。
- 这是什么?
- 第四部分:硬盘空间 (消化系统检查)
- 这是什么?
df -hT是我们的“肠胃镜”,它会检查服务器上每一块“硬盘分区”(粮仓)的使用率。脚本会逐行扫描,将任何使用率超过阈值(默认90%)的分区,用红色高亮出来。硬盘被日志或缓存文件塞满,是另一个极其常见的“服务器猝死”原因。
- 这是什么?
- 第五部分:网络信息 (神经系统检查)
- 这是什么? 这里会显示服务器的IP地址,并用
ss -tuln命令,列出所有正在“竖起耳朵”监听外部请求的端口。这能帮你快速发现,是否有异常的端口正在被监听,可能存在后门。
- 这是什么? 这里会显示服务器的IP地址,并用
- 第六、七部分:活动检查 (谁在活动?谁最累?)
- 这是什么?
who命令让你知道,此刻有谁正登录在你的服务器上,防止“不速之客”的潜入。而ps命令,则像一个精密的仪器,直接揪出了当前消耗CPU和内存最多的“十大劳模”进程。如果你的服务器卡顿,元凶大概率就在这两个列表的榜首。
- 这是什么?
如何“派遣”你的机器人?—— 使用与自动化
- 赋予生命: 首先,给你的脚本文件赋予“生命”(可执行权限):
Bash
chmod +x health_check.sh
2首次体检: 直接运行它,看看第一份报告长什么样:
Bash
./health_check.sh
你会看到一份彩色的、结构清晰的报告,直接打印在你的屏幕上。
3设置“定期体检”计划 (自动化): 这才是我们最终的目的。我们要用cron,来设置一个“定时闹钟”。
Bash
crontab -e
在打开的文件最后,加入这样一行:
0 9 * * 1 /home/myadmin/health_check.sh > /home/myadmin/health_reports/report_$(date +\%Y\%m\%d).log 2>&1
- 这行“咒语”的意思是: “在每周一 (1) 的早上9点0分,请自动运行
/home/myadmin/目录下的health_check.sh脚本。然后,不要把结果打印在屏幕上,而是把所有的输出(>),都保存(>)到/home/myadmin/health_reports/这个文件夹里一个以当天日期命名的.log报告文件中。2>&1表示把错误信息也一并保存进去。” (请确保/home/myadmin/health_reports/这个文件夹已经提前创建好了)
运筹帷幄,决胜千里
好了,从现在开始,你的“自动化健康巡检机器人”,已经正式上岗了。
你不再需要每天提心吊胆,也不再需要每次都繁琐地登录服务器去敲一堆命令。你只需要,在每周一的早上,泡上一杯咖啡,悠闲地打开那个最新生成的“体检报告”,花上一分钟,扫一眼其中是否有刺眼的“红色警报”。
这份脚本,现在就是你工具箱里最趁手的“听诊器”。它可能无法像华丽的商业监控面板那样,给你提供酷炫的图表,但它朴实、可靠,深入骨髓,并且完全由你掌控。
定期为你的“钢铁战士”做一次体检吧。这是一种专业的习惯,更是一种对你所有心血,都极其负责的态度。一个健康的服务器,才能支撑你,去打赢下一场硬仗。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)