【问题标题】:Bash Script Monitor Program for Specific Output特定输出的 Bash 脚本监控程序
【发布时间】:2011-09-07 06:42:19
【问题描述】:

所以这可能是一个简单的问题,但我不是一个 bash 程序员,我无法弄清楚这一点。

我们有一个闭源程序,它调用一个子程序,该子程序一直运行直到退出,此时程序将再次调用该子程序。这会无限重复。

不幸的是,主程序有时会在随机的一段时间后自发地(并且反复地)调用子程序失败。最终的解决方案是联系原始开发人员以获得支持,但同时我们需要快速修复该问题。

我正在尝试编写一个 bash 脚本来监视程序的输出,当它看到特定的字符串时,它将重新启动机器(程序将在启动时再次自动运行)。 bash 脚本需要将所有标准输出传递到屏幕,直到它看到特定的字符串。程序还需要继续处理用户输入。

我尝试了以下方法,但效果有限:

./program1 | ./watcher.sh

watcher.sh 基本上就是这样:

while read line; do
    echo $line
    if [$line == "some string"]
    then
        #the reboot script works fine
        ./reboot.sh 
    fi
done

这似乎工作正常,但是在 echo 语句中去除了前导空格,并且 echo 输出在中间挂起,直到子程序退出,此时输出的其余部分被打印到屏幕上。有没有更好的方法来完成我需要做的事情?

提前致谢。

【问题讨论】:

    标签: bash scripting


    【解决方案1】:

    我会按照以下方式做一些事情:

    stdbuf -o0 ./program1 | grep --line-buffered "some string" | (read && reboot)
    

    【讨论】:

      【解决方案2】:
      1. 您需要引用您的 $line 变量,即 "$line" 用于所有引用 *(read line 位除外)。

      2. 您的program1 可能是“暂停”数据的来源。它需要flush 其输出缓冲区。你可能无法控制它,所以

        一个。检查您的系统是否有可用的unbuffer 命令。如果是这样,请尝试 unbuffer cmd1 | watcher 您可能必须尝试使用​​哪个 cmd 来包装 unbuffer,也许您必须使用 cmd1 | unbuffer watcher

        b.或者您可以尝试将观察者包装为一个进程组,(我认为这是正确的术语),即

        ./program1 | { ./watcher.sh ; printf "\n" ; }

      我希望这会有所帮助。

      附:由于您似乎是新用户,如果您得到对您有帮助的答案,请记住将其标记为已接受,和/或给它一个 +(或 -)作为有用的答案。

      【讨论】:

        【解决方案3】:

        使用read$REPLY 变量,我也建议使用printf 而不是echo

        while read; do
            printf "%s\n" "$REPLY"
            # '[[' is Bash, quotes are not necessary 
            # use '[ "$REPLY" == "some string" ]' if in another shell
            if [[ $REPLY == "some string" ]] 
            then
                #the reboot script works fine
                ./reboot.sh 
            fi
        done
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-02
          • 1970-01-01
          • 1970-01-01
          • 2011-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多