在日常服务器或工作站维护中,经常需要根据硬件状态决定下一步操作。比如磁盘快满了要报警,内存使用过高要记录日志。这些自动化判断,靠手动查看太累,用shell脚本里的条件判断就能自动完成。
文件和目录是否存在判断
比如你想定期检查某个监控日志是否存在,避免程序没启动。可以用 -f 判断文件,-d 判断目录:
if [ -f "/var/log/hardware_monitor.log" ]; then
echo "日志正常生成"
else
echo "警告:日志文件缺失!"
fi
如果某台机器的 /tmp 目录突然不见了(虽然少见),可以用下面的方式检测:
if [ ! -d "/tmp" ]; then
mkdir /tmp
echo "/tmp 目录已重建"
fi
磁盘使用率超过阈值自动提醒
这是实际工作中最常用的场景之一。写个脚本定期检查根分区,超过90%就提示:
usage=$(df / | grep "/" | awk '{print $5}' | sed 's/%//')
if [ $usage -gt 90 ]; then
echo "警告:根分区使用率 $usage%"
fi
这种脚本能放在 cron 里每小时跑一次,省得天天手动 df 查看。
比较数值大小做决策
有时候要判断剩余内存够不够。比如你想确认空闲内存是否低于512MB:
free_mem=$(free -m | grep "^Mem" | awk '{print $7}')
if [ $free_mem -lt 512 ]; then
echo "内存紧张,当前可用 $free_mem MB"
fi
注意这里用的是 -lt(小于),如果是大于用 -gt,等于用 -eq,这些都是整数比较常用的操作符。
组合条件更灵活
实际环境中往往需要多个条件一起判断。比如:只有在是周一且系统负载低于3时才执行备份:
day=$(date +%u) # 周一为1
load=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')
if [ $day -eq 1 ] && [ $(echo "$load < 3" | bc) -eq 1 ]; then
echo "开始每周一备份"
# 执行备份命令
fi
这里的 && 表示“并且”,也可以用 || 表示“或者”,逻辑清晰,写起来也顺手。
设备文件是否存在判断硬件状态
有些老式硬件通过设备文件暴露状态。比如检查是否有GPU设备:
if [ -c "/dev/nvidia0" ]; then
echo "NVIDIA显卡在线"
else
echo "未检测到NVIDIA显卡"
fi
这种判断在批量部署图形工作站时特别有用,脚本能自动识别设备情况。
把这些小判断串起来,一个简单的硬件健康检查脚本就有了。不需要复杂工具,几行 shell 命令加点条件逻辑,就能让运维工作轻松不少。