一、为什么要用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"
这个基础脚本揭示了两个重要技巧:
/proc虚拟文件系统是硬件信息的宝库free和grep等命令的组合使用可以提取关键数据
三、高级诊断:磁盘健康监测
机械硬盘的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脚本 | 自动化,可定制 | 需要编写维护脚本 |
| 专业监控系统 | 功能全面 | 部署复杂,资源占用大 |
八、典型应用场景
- 数据中心巡检:每天凌晨3点自动运行,生成报告发送管理员邮箱
- 故障排查:在性能问题出现时快速执行,60秒内获取完整硬件快照
- 装机验收:新服务器上架时验证硬件配置是否符合采购订单
九、避坑指南
权限问题:
- SMART检测需要root权限
- 解决方案:通过sudoers文件授权特定命令
命令兼容性:
- 不同Linux发行版的工具输出格式可能不同
- 应对方案:使用
awk等工具统一处理文本格式
虚拟化环境:
- VMware/KVM等环境可能无法获取真实硬件信息
- 解决方法:添加虚拟化平台判断逻辑
十、性能优化建议
减少子进程调用:
# 低效写法(创建多个grep进程) cpu=$(grep "model" /proc/cpuinfo | grep "Intel") # 优化写法(单次模式匹配) cpu=$(awk '/model.*Intel/' /proc/cpuinfo)使用缓存机制:
对于不常变动的信息(如CPU型号),可以写入临时文件避免重复查询
十一、扩展思路
与Prometheus集成:
# 输出Prometheus格式的指标 echo "node_cpu_temp $(sensors | awk '/Package/{print $4}')"微信/钉钉告警:
结合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 "$@"
十三、总结提升
优秀的硬件检测脚本应该像经验丰富的老工程师——既能快速发现明显问题,又能捕捉细微异常。建议从简单脚本开始,逐步添加以下高级功能:
- 历史数据对比功能
- 自动化修复能力(如发现内存泄漏自动重启服务)
- 硬件资产变更追踪
记住:不要试图用一个脚本解决所有问题。将大脚本拆分为模块化小脚本,通过主程序调用的方式更利于维护。
评论