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

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

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

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

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

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

Table of Contents

“巡检机器人”的完整代码

别急着去理解每一行代码。先把你的“机器人”领回家。将下面所有的代码,完整地复制,粘贴到你服务器上一个名为health_check.sh的文件里。

Bash

 
  1. #!/bin/bash
  2. # ==============================================================================
  3. # Linux 服务器自动化健康巡检脚本
  4. #
  5. # 功能: 生成一份关于系统、CPU、内存、硬盘、网络和进程的综合健康报告。
  6. # 使用: 1. 将脚本保存为 health_check.sh
  7. # 2. 赋予执行权限: chmod +x health_check.sh
  8. # 3. 运行: ./health_check.sh
  9. # ==============================================================================
  10. # --- 全局颜色定义 ---
  11. RED='\033[0;31m'
  12. GREEN='\033[0;32m'
  13. YELLOW='\033[1;33m'
  14. NC='\033[0m' # No Color
  15. # --- 阈值定义 ---
  16. LOAD_THRESHOLD=10.0 # CPU负载阈值
  17. MEM_USAGE_THRESHOLD=90 # 内存使用率阈值 (%)
  18. DISK_USAGE_THRESHOLD=90 # 硬盘使用率阈值 (%)
  19. # --- 报告头部 ---
  20. echo -e "================================================="
  21. echo -e " Linux 服务器健康巡检报告"
  22. echo -e "================================================="
  23. echo -e "报告生成时间: $(date +"%Y-%m-%d %H:%M:%S")"
  24. echo ""
  25. # --- 1. 系统信息 ---
  26. echo -e "${YELLOW}--- 1. 系统信息 ---${NC}"
  27. HOSTNAME=$(hostname)
  28. OS_VERSION=$(cat /etc/os-release | grep "PRETTY_NAME" | cut -d'"' -f2)
  29. KERNEL_VERSION=$(uname -r)
  30. UPTIME=$(uptime -p)
  31. LAST_REBOOT=$(who -b | awk '{print $3, $4}')
  32. echo -e "主机名: ${HOSTNAME}"
  33. echo -e "操作系统: ${OS_VERSION}"
  34. echo -e "内核版本: ${KERNEL_VERSION}"
  35. echo -e "已运行时间: ${UPTIME}"
  36. echo -e "上次启动时间: ${LAST_REBOOT}"
  37. echo ""
  38. # --- 2. CPU 信息 ---
  39. echo -e "${YELLOW}--- 2. CPU 信息 ---${NC}"
  40. CPU_CORES=$(grep -c ^processor /proc/cpuinfo)
  41. LOAD_AVERAGE=$(uptime | awk -F'load average:' '{print $2}')
  42. LOAD_1MIN=$(echo ${LOAD_AVERAGE} | awk '{print $1}' | tr -d ',')
  43. echo -e "CPU核心数: ${CPU_CORES}"
  44. echo -e "平均负载 (1min, 5min, 15min): ${LOAD_AVERAGE}"
  45. if (( $(echo "${LOAD_1MIN} > ${LOAD_THRESHOLD}" | bc -l) )); then
  46. echo -e "${RED}[警告] 1分钟内CPU平均负载 (${LOAD_1MIN}) 超过阈值 (${LOAD_THRESHOLD})!${NC}"
  47. fi
  48. echo ""
  49. # --- 3. 内存信息 ---
  50. echo -e "${YELLOW}--- 3. 内存信息 ---${NC}"
  51. MEM_TOTAL=$(free -h | awk 'NR==2{print $2}')
  52. MEM_USED=$(free -h | awk 'NR==2{print $3}')
  53. MEM_FREE=$(free -h | awk 'NR==2{print $4}')
  54. MEM_USAGE_PERCENT=$(free -m | awk 'NR==2{printf "%.2f", $3*100/$2}')
  55. echo -e "总内存: ${MEM_TOTAL}"
  56. echo -e "已用内存: ${MEM_USED}"
  57. echo -e "可用内存: ${MEM_FREE}"
  58. echo -e "内存使用率: ${MEM_USAGE_PERCENT}%"
  59. if (( $(echo "${MEM_USAGE_PERCENT} > ${MEM_USAGE_THRESHOLD}" | bc -l) )); then
  60. echo -e "${RED}[警告] 内存使用率 (${MEM_USAGE_PERCENT}%) 超过阈值 (${MEM_USAGE_THRESHOLD}%)!${NC}"
  61. fi
  62. SWAP_TOTAL=$(free -h | awk 'NR==3{print $2}')
  63. SWAP_USED=$(free -h | awk 'NR==3{print $3}')
  64. echo -e "Swap总计: ${SWAP_TOTAL}"
  65. echo -e "Swap已用: ${SWAP_USED}"
  66. echo ""
  67. # --- 4. 硬盘空间 ---
  68. echo -e "${YELLOW}--- 4. 硬盘空间 ---${NC}"
  69. df -hT | awk 'NR>1 {print $0}' | while read -r line; do
  70. USAGE_PERCENT=$(echo ${line} | awk '{print $6}' | tr -d '%')
  71. if [[ "${USAGE_PERCENT}" -ge "${DISK_USAGE_THRESHOLD}" ]]; then
  72. echo -e "${RED}${line}${NC}"
  73. else
  74. echo -e "${line}"
  75. fi
  76. done
  77. echo ""
  78. # --- 5. 网络信息 ---
  79. echo -e "${YELLOW}--- 5. 网络信息 ---${NC}"
  80. IP_ADDRESS=$(hostname -I)
  81. echo -e "IP 地址: ${IP_ADDRESS}"
  82. echo -e "当前监听的端口 (TCP/UDP):"
  83. ss -tuln | sed '1d'
  84. echo ""
  85. # --- 6. 登录用户信息 ---
  86. echo -e "${YELLOW}--- 6. 当前登录用户 ---${NC}"
  87. who
  88. echo ""
  89. # --- 7. 资源消耗TOP 10 ---
  90. echo -e "${YELLOW}--- 7. 资源消耗 TOP 10 ---${NC}"
  91. echo -e "CPU占用 TOP 10:"
  92. ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%cpu | head -n 11
  93. echo ""
  94. echo -e "内存占用 TOP 10:"
  95. ps -eo pid,ppid,%cpu,%mem,cmd --sort=-%mem | head -n 11
  96. echo ""
  97. # --- 报告尾部 ---
  98. echo -e "================================================="
  99. echo -e " 报告结束"
  100. echo -e "================================================="
解剖“机器人”:它到底在检查什么?

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

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

Bash

 
  1. chmod +x health_check.sh

2首次体检: 直接运行它,看看第一份报告长什么样:

Bash

 
  1. ./health_check.sh

你会看到一份彩色的、结构清晰的报告,直接打印在你的屏幕上。

3设置“定期体检”计划 (自动化): 这才是我们最终的目的。我们要用cron,来设置一个“定时闹钟”。

Bash

 
  1. crontab -e

在打开的文件最后,加入这样一行:

 
  1. 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/这个文件夹已经提前创建好了)

运筹帷幄,决胜千里

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

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

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

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

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐