用于特定输出的Bash脚本监视程序

时间:2011-09-06 18:42:40

标签: bash scripting

所以这可能是一个简单的问题,但我不是一个重击程序员而且我无法解决这个问题。

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

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

我正在尝试编写一个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语句中删除了前导空格,并且回声输出在中间挂起,直到子程序退出,此时输出的其余部分将打印到屏幕上。有没有更好的方法来完成我需要做的事情?

提前致谢。

3 个答案:

答案 0 :(得分:3)

我会按照以下方式做点什么:

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

答案 1 :(得分:0)

  1. 您需要引用$ line变量,即所有引用的"$line" *(read line位除外)。

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

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

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

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

  3. 我希望这会有所帮助。

    P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。

答案 2 :(得分:0)

使用read的{​​{1}}变量,我建议使用$REPLY代替printf

echo