You need to enable JavaScript to run this app. 检测两台打印机在线状态故障发邮件的ksh脚本无限循环问题
优惠活动
大模型
产品
解决方案
定价
更多

检测两台打印机在线状态故障发邮件的ksh脚本无限循环问题

ksh打印机检测脚本问题修复

无限循环根因

你脚本中的循环变量自增语句写法错误,c = $c + 1中等号两侧存在空格,ksh会将这行识别为外部命令而非变量赋值,导致c变量的值永远停留在初始值1,循环条件$c -le 3永远成立,因此出现死循环。

其他需修复的逻辑错误

  1. 状态判断逻辑完全错误:当前[[ ! $STATUS == "DOWN" ||! $STATUS == "OFF" ]]属于永真条件,无论STATUS取任何值都会触发邮件发送,完全不符合你“仅状态为DOWN/OFF时发告警”的需求
  2. 状态提取逻辑错误:你用grep 'READY'过滤lpstat的输出,若打印机真的处于DOWN/OFF状态,这行过滤会拿不到任何结果,STATUS变量为空,根本无法检测到异常
  3. 循环上限错误:你只需要检测2台打印机,循环条件写的是$c -le 3,会多检测不存在的printer03
  4. 冗余语法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 12:45:03