一、为什么要用Shell脚本检查硬件状态

当服务器出现性能问题时,手动检查每个硬件组件就像在迷宫里找出口——效率低还容易遗漏重点。Shell脚本就像给你的工具箱加了自动导航,三行命令就能把CPU负载、内存占用、磁盘健康这些关键指标整齐地摆在面前。

实际工作中遇到过这样的案例:某电商大促期间突然出现数据库响应缓慢,运维团队花了2小时才确认是RAID卡电池故障导致写入缓存关闭。如果提前有自动化硬件检测脚本,这个问题10分钟就能定位。

二、基础硬件信息采集实战

(技术栈:Bash Shell + 标准Linux工具集)

#!/bin/bash
# 获取CPU核心数与型号
echo "===== CPU信息 ====="
cpu_core=$(grep -c "model name" /proc/cpuinfo)  # 统计物理核心数
cpu_model=$(grep "model name" /proc/cpuinfo | head -n1 | cut -d ":" -f2)  
echo "核心数: $cpu_core"
echo "型号: $cpu_model"

# 获取内存总量与可用量(单位自动转换为GB)
mem_total=$(free -h | awk '/Mem/{print $2}')
mem_available=$(free -h | awk '/Mem/{print $7}')
echo -e "\n===== 内存信息 ====="
echo "总内存: $mem_total"
echo "可用内存: $mem_available"

这个基础脚本揭示了两个重要技巧:

  1. /proc虚拟文件系统是硬件信息的宝库
  2. freegrep等命令的组合使用可以提取关键数据

三、高级诊断:磁盘健康监测

机械硬盘的SMART数据就像汽车的OBD诊断接口,能预测潜在故障:

#!/bin/bash
# 检查磁盘SMART状态(需要root权限)
echo -e "\n===== 磁盘健康检测 ====="
for disk in $(lsblk -d -o NAME | grep -v NAME); do
    # 使用smartctl工具读取健康状态
    health=$(smartctl -H /dev/$disk | grep "SMART overall-health")
    echo "/dev/$disk 状态: ${health##*: }"
    
    # 检查坏道数量(仅机械硬盘有效)
    bad_sectors=$(smartctl -A /dev/$disk | grep "Reallocated_Sector_Ct")
    echo "坏道计数: ${bad_sectors##* }"
done

注意事项:

  • NVMe固态硬盘需要使用smartctl -a /dev/nvme0n1特殊语法
  • 企业级环境建议增加-d megaraid,N参数适配RAID卡场景

四、温度监控与预警机制

过热的服务器就像发高烧的病人,需要持续监测:

#!/bin/bash
# CPU温度监控(依赖lm-sensors包)
echo -e "\n===== 温度监测 ====="
if type sensors >/dev/null 2>&1; then
    cpu_temp=$(sensors | grep "Package id" | awk '{print $4}')
    echo "CPU温度: $cpu_temp"
else
    echo "警告: lm-sensors未安装,请执行 apt install lm-sensors"
fi

# 添加阈值判断
critical_temp=80  # 设置临界温度(℃)
current_temp=$(echo $cpu_temp | tr -dc '0-9')  # 提取数字部分
if [ $current_temp -gt $critical_temp ]; then
    echo "警报!CPU温度超过临界值!"
fi

五、网络设备深度检测

千兆网卡跑在百兆模式?这种问题肉眼很难发现:

#!/bin/bash
# 检测网卡工作模式
echo -e "\n===== 网络设备检测 ====="
for nic in $(ls /sys/class/net/ | grep -v lo); do
    speed=$(cat /sys/class/net/$nic/speed 2>/dev/null)
    duplex=$(cat /sys/class/net/$nic/duplex 2>/dev/null)
    [ -z "$speed" ] && speed="未知"
    echo "网卡 $nic : ${speed}Mbps $duplex模式"
done

这个检测能发现:

  • 双工模式不匹配导致的网络丢包
  • 光纤模块降级运行的情况

六、实战:生成HTML报告

把零散信息整合成可视化报告更利于分析:

#!/bin/bash
# 生成HTML格式报告
report_file="hardware_report_$(date +%Y%m%d).html"
{
echo "<html><body>"
echo "<h1>服务器硬件检测报告 - $(date)</h1>"
echo "<table border=1>"
echo "<tr><th>检测项</th><th>数值</th></tr>"
# CPU信息行
echo "<tr><td>CPU核心数</td><td>$(grep -c "model name" /proc/cpuinfo)</td></tr>"
# 内存信息行
echo "<tr><td>可用内存</td><td>$(free -h | awk '/Mem/{print $7}')</td></tr>"
echo "</table>"
echo "</body></html>"
} > $report_file

进阶技巧:

  • 使用CSS美化表格样式
  • 添加JavaScript实现图表展示
  • 通过cron定时生成报告

七、技术方案对比分析

检测方式 优点 缺点
手动命令 灵活可控 效率低,易遗漏
Shell脚本 自动化,可定制 需要编写维护脚本
专业监控系统 功能全面 部署复杂,资源占用大

八、典型应用场景

  1. 数据中心巡检:每天凌晨3点自动运行,生成报告发送管理员邮箱
  2. 故障排查:在性能问题出现时快速执行,60秒内获取完整硬件快照
  3. 装机验收:新服务器上架时验证硬件配置是否符合采购订单

九、避坑指南

  1. 权限问题

    • SMART检测需要root权限
    • 解决方案:通过sudoers文件授权特定命令
  2. 命令兼容性

    • 不同Linux发行版的工具输出格式可能不同
    • 应对方案:使用awk等工具统一处理文本格式
  3. 虚拟化环境

    • VMware/KVM等环境可能无法获取真实硬件信息
    • 解决方法:添加虚拟化平台判断逻辑

十、性能优化建议

  1. 减少子进程调用:

    # 低效写法(创建多个grep进程)
    cpu=$(grep "model" /proc/cpuinfo | grep "Intel")  
    
    # 优化写法(单次模式匹配)
    cpu=$(awk '/model.*Intel/' /proc/cpuinfo)
    
  2. 使用缓存机制:
    对于不常变动的信息(如CPU型号),可以写入临时文件避免重复查询

十一、扩展思路

  1. 与Prometheus集成:

    # 输出Prometheus格式的指标
    echo "node_cpu_temp $(sensors | awk '/Package/{print $4}')"
    
  2. 微信/钉钉告警:
    结合curl命令将关键告警发送到移动端

十二、完整脚本示例

#!/bin/bash
# 硬件健康检测大师脚本 v1.2
# 功能:全面检测Linux服务器硬件状态

# 初始化日志文件
LOG_FILE="/var/log/hwcheck.log"
exec > >(tee -a "$LOG_FILE") 2>&1

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color

function check_cpu() {
    echo -e "\n${GREEN}[CPU检测]${NC}"
    # 多维度CPU检测逻辑...
}

function check_memory() {
    echo -e "\n${GREEN}[内存检测]${NC}"
    # 高级内存分析...
}

# 主程序流程
main() {
    check_cpu
    check_memory
    # 其他检测模块...
}

main "$@"

十三、总结提升

优秀的硬件检测脚本应该像经验丰富的老工程师——既能快速发现明显问题,又能捕捉细微异常。建议从简单脚本开始,逐步添加以下高级功能:

  1. 历史数据对比功能
  2. 自动化修复能力(如发现内存泄漏自动重启服务)
  3. 硬件资产变更追踪

记住:不要试图用一个脚本解决所有问题。将大脚本拆分为模块化小脚本,通过主程序调用的方式更利于维护。