检测两台打印机在线状态故障发邮件的ksh脚本无限循环问题
ksh打印机检测脚本问题修复
无限循环根因
你脚本中的循环变量自增语句写法错误,c = $c + 1中等号两侧存在空格,ksh会将这行识别为外部命令而非变量赋值,导致c变量的值永远停留在初始值1,循环条件$c -le 3永远成立,因此出现死循环。
其他需修复的逻辑错误
- 状态判断逻辑完全错误:当前
[[ ! $STATUS == "DOWN" ||! $STATUS == "OFF" ]]属于永真条件,无论STATUS取任何值都会触发邮件发送,完全不符合你“仅状态为DOWN/OFF时发告警”的需求 - 状态提取逻辑错误:你用
grep 'READY'过滤lpstat的输出,若打印机真的处于DOWN/OFF状态,这行过滤会拿不到任何结果,STATUS变量为空,根本无法检测到异常 - 循环上限错误:你只需要检测2台打印机,循环条件写的是
$c -le 3,会多检测不存在的printer03 - 冗余语法错误:mail命令外层包裹的反引号没有任何作用,反而会增加不必要的解析开销;脚本中使用的
$s_time变量没有提前定义,运行时会显示为空
修复后的完整脚本
#!/bin/ksh c=1 # 提前定义脚本启动时间变量 s_time=$(date +%H:%M:%S) while [[ $c -le 2 ]]; do # 直接提取打印机状态,不过滤READY字段 STATUS=$(lpstat -p printer0$c | awk '{print $3}') # 仅当状态为DOWN或OFF时触发告警 if [[ $STATUS == "DOWN" || $STATUS == "OFF" ]]; then today=$(date +%m%d%Y) log_file="/lsf10/monitors/lpstat_email_$today.txt" # 生成告警邮件内容 echo "*** START EMAIL SUMMARY *** " > $log_file echo "* " >> $log_file echo "* Date - `date` " >> $log_file echo "* " >> $log_file echo "* Start time => $s_time " >> $log_file echo "* Current time => `date +%H:%M:%S` " >> $log_file echo "* " >> $log_file echo "* Printer printer0$c is currently $STATUS, please investigate. " >> $log_file echo "* " >> $log_file echo "*** END EMAIL SUMMARY *** " >> $log_file # 发送告警邮件 mail -s "Mobius Printer Down Alert!" "email1,email2" < $log_file # 删除临时日志文件,避免冗余占用磁盘 rm -f $log_file fi # 正确的循环变量自增写法 c=$((c+1)) done exit
改动说明
- 修正循环变量自增语法,移除等号两侧空格,使用
$(())包裹数值运算,彻底解决无限循环问题 - 重构状态检测逻辑:移除
grep 'READY'过滤,直接提取打印机状态字段,将判断条件调整为仅DOWN/OFF时触发告警,符合需求 - 将循环上限从3改为2,匹配2台打印机的检测需求
- 新增
$s_time变量的定义,避免空变量问题 - 移除mail命令外层无用的反引号,优化临时文件的路径引用,新增发送后删除临时文件的逻辑
- 优化邮件内容,直接显示异常打印机编号和当前状态,排查更直观
内容的提问来源于stack exchange,提问作者Configueroa
相关产品推荐
相关产品推荐

