在硬件维护过程中,自动化任务往往依赖于bash脚本。比如,定时采集服务器温度、检查硬盘健康状态或批量更新固件版本。当脚本运行异常时,直接在终端窗口调试是最直接有效的方式。
启用脚本的详细输出模式
最简单的调试方法是让bash解释器帮你追踪执行过程。在脚本开头使用-x选项,可以让每一条命令在执行前先打印出来。比如:
#!/bin/bash -x
# 检查CPU温度
echo "读取温度..."
sensors | grep 'Core'
运行这个脚本时,你会看到每一行实际执行的命令和变量替换后的值,方便定位问题。
使用set命令动态控制调试开关
有时候不想全程输出,只关注某一段逻辑。可以在脚本中插入set -x开启追踪,用set +x关闭:
#!/bin/bash
echo "开始检测磁盘空间"
df -h /tmp
set -x
# 重点调试区域:清理缓存
rm -rf /tmp/cache/*
[ -d "/tmp/cache" ] || mkdir /tmp/cache
set +x
echo "清理完成"
这样只在关键路径上显示执行细节,避免信息过载。
利用echo打印中间状态
面对复杂的条件判断或循环,插入echo语句是最接地气的手段。例如,在判断硬盘是否离线时:
disk_status=$(smartctl -H /dev/sdb)
echo "【调试】磁盘返回结果:$disk_status"
if echo "$disk_status" | grep -q "PASSED"; then
echo "磁盘健康"
else
echo "警告:磁盘可能故障"
fi
虽然简单,但能在没有调试器的环境下快速暴露变量内容。
捕获信号与错误处理
脚本被中断或出错时,知道最后一步执行了什么很重要。可以用trap命令记录退出点:
#!/bin/bash
# 记录脚本退出位置
cleanup() {
echo "【调试】脚本在第 $LINENO 行退出"
}
debug_info() {
echo "【错误】在第 $LINENO 行发生问题"
}
trap cleanup EXIT
trap debug_info ERR
# 模拟一个可能失败的操作
bad_command_not_exist
这种机制在远程维护无人值守设备时特别有用,能减少反复连接排查的时间。
结合日志文件辅助分析
有些硬件环境不允许实时盯着终端,可以把调试输出重定向到日志:
#!/bin/bash -x
exec >& /var/log/hw-maint.log
# 后续所有命令和输出都会记录
echo "启动风扇校准程序"
./fan_calibrate.sh
之后用tail -f /var/log/hw-maint.log观察即可,适合长时间运行的任务。