Linux服务器健康检查Shell脚本:一键生成自动化巡检报告

更多云服务器知识,尽在hostol.com

你的服务器,就像一个忠诚无比、7x24小时为你站岗的"钢铁战士"。它抵御着网络的风风雨-雨,承载着你所有的创意和心血。

但即便是最强悍的战士,也可能会有"亚健康"的时候。它从不抱怨,直到有一天,它可能会因为一个小小的、被我们长期忽视的问题,而轰然倒下。

你,作为它的"指挥官",真的了解它的健康状况吗?

  • 你知道它的"心率"(CPU负载)是否偶尔会飙升到危险的边缘吗?
  • 你知道它的"肺活量"(内存)是否因为某个内存泄漏的应用,已经被悄悄地占用了90%吗?
  • 你知道它的"粮仓"(硬盘)是否因为日志文件没有及时清理,即将被"撑爆"吗?

我们不可能每天都像个侦探一样,登录到服务器上,敲下一连串的命令去逐项检查。这种重复性的劳动,既浪费时间,也容易遗漏。

今天,我将给你一份"年度体检清单 ",并把它变成一个你可以一键执行的自动化Shell脚本 。从此,你只需设置一个定时任务,让这个"巡检机器人"每周一的早上,自动为你生成一份图文并茂、重点突出的"服务器健康报告"。你只需花一分钟看一眼这份报告,就能对你这位"钢铁战士"过去一周的健康状况,了如指掌。

"巡检机器人"的完整代码

别急着去理解每一行代码。先把你的"机器人"领回家。将下面所有的代码,完整地复制,粘贴到你服务器上一个名为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) )); then
    echo -e "${RED}[警告] 1分钟内CPU平均负载 (${LOAD_1MIN}) 超过阈值 (${LOAD_THRESHOLD})!${NC}"
fi
echo ""

# --- 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) )); then
    echo -e "${RED}[警告] 内存使用率 (${MEM_USAGE_PERCENT}%) 超过阈值 (${MEM_USAGE_THRESHOLD}%)!${NC}"
fi
SWAP_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; do
    USAGE_PERCENT=$(echo ${line} | awk '{print $6}' | tr -d '%')
    if [[ "${USAGE_PERCENT}" -ge "${DISK_USAGE_THRESHOLD}" ]]; then
        echo -e "${RED}${line}${NC}"
    else
        echo -e "${line}"
    fi
done
echo ""

# --- 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}"
who
echo ""

# --- 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 11
echo ""
echo -e "内存占用 TOP 10:"
ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%mem | head -n 11
echo ""

# --- 报告尾部 ---
echo -e "================================================="
echo -e "              报告结束"
echo -e "================================================="
解剖"机器人":它到底在检查什么?

好了,现在我们来逐一解剖这个"机器人"的"大脑",看看它的每一个检查动作,背后都有什么深意。

  • 第一部分:系统信息
    • 这是什么? 这是"体检报告"的"个人基本信息"栏。它告诉你这位战士的姓名(主机名)、年龄(已运行时间)、以及它的"身份证号"(操作系统和内核版本)。
  • 第二部分:CPU信息 (心脏检查)
    • 这是什么? 这里核心是检查load average(平均负载)。我们用立交桥的比喻解释过,这个值如果持续高于你的CPU核心数,就说明"心脏"压力过大。脚本会自动将当前1分钟的负载与你设定的阈值(默认是10)进行比较,如果超标,会用红色高亮发出警告。
  • 第三部分:内存信息 (肺活量与脑容量检查)
    • 这是什么? free -h命令清晰地展示了你的物理内存和Swap(虚拟内存)的使用情况。脚本会自动计算内存使用率,一旦超过阈值(默认90%),同样会红色高亮警告。内存耗尽,是导致服务崩溃和服务器死机的头号元凶之一。
  • 第四部分:硬盘空间 (消化系统检查)
    • 这是什么? df -hT是我们的"肠胃镜",它会检查服务器上每一块"硬盘分区"(粮仓)的使用率。脚本会逐行扫描,将任何使用率超过阈值(默认90%)的分区,用红色高亮出来。硬盘被日志或缓存文件塞满,是另一个极其常见的"服务器猝死"原因。
  • 第五部分:网络信息 (神经系统检查)
    • 这是什么? 这里会显示服务器的IP地址,并用ss -tuln命令,列出所有正在"竖起耳朵"监听外部请求的端口。这能帮你快速发现,是否有异常的端口正在被监听,可能存在后门。
  • 第六、七部分:活动检查 (谁在活动?谁最累?)
    • 这是什么? who命令让你知道,此刻有谁正登录在你的服务器上,防止"不速之客"的潜入。而ps命令,则像一个精密的仪器,直接揪出了当前消耗CPU和内存最多的"十大劳模"进程。如果你的服务器卡顿,元凶大概率就在这两个列表的榜首。
如何"派遣"你的机器人?------ 使用与自动化
  1. 赋予生命: 首先,给你的脚本文件赋予"生命"(可执行权限):

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. 这行"咒语"的意思是: "在每周一 (1)早上9点0分 ,请自动运行/home/myadmin/目录下的health_check.sh脚本。然后,不要把结果打印在屏幕上,而是把所有的输出(>),都保存(>)到/home/myadmin/health_reports/这个文件夹里一个以当天日期命名的.log报告文件中。2>&1表示把错误信息也一并保存进去。" (请确保/home/myadmin/health_reports/这个文件夹已经提前创建好了)

运筹帷幄,决胜千里

好了,从现在开始,你的"自动化健康巡检机器人",已经正式上岗了。

你不再需要每天提心吊胆,也不再需要每次都繁琐地登录服务器去敲一堆命令。你只需要,在每周一的早上,泡上一杯咖啡,悠闲地打开那个最新生成的"体检报告",花上一分钟,扫一眼其中是否有刺眼的"红色警报"。

这份脚本,现在就是你工具箱里最趁手的"听诊器"。它可能无法像华丽的商业监控面板那样,给你提供酷炫的图表,但它朴实、可靠,深入骨髓,并且完全由你掌控。

定期为你的"钢铁战士"做一次体检吧。这是一种专业的习惯,更是一种对你所有心血,都极其负责的态度。一个健康的服务器,才能支撑你,去打赢下一场硬仗

相关推荐
Sadsvit1 小时前
网络聚合链路与软件网桥配置指南
linux·运维·服务器·网络·centos
___波子 Pro Max.1 小时前
Linux数字列排序命令
linux
网硕互联的小客服2 小时前
如何配置安全的SFTP服务器?
运维·服务器·安全
sinat_286945192 小时前
AI服务器介绍
服务器·人工智能·算法·chatgpt·transformer
ALLSectorSorft2 小时前
搭子交友 app 动态分享与打卡系统设计实现
java·服务器·数据库·人工智能·oracle·交友
--运维实习生--3 小时前
shell脚本第二阶段-----选择结构
linux·运维·shell编程
时间裂缝里的猫-O-4 小时前
@Linux问题 :bash fork Cannot allocate memory 错误分析与解决方案
linux·chrome·bash
躺不平的小刘4 小时前
从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南
linux·python·嵌入式硬件·yolo·conda·pyqt·pip
愚昧之山绝望之谷开悟之坡5 小时前
| `cat /etc/os-release` | 发行版详细信息(如 Ubuntu、CentOS) |
linux·ubuntu·centos