2011-09-06 53 views
4

所以这可能是一个简单的问题,但我并不是一个bash程序员,我也无法弄清楚这一点。针对特定输出的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 

这似乎是工作确定,但领先的空白被剥离的回声语句,回声输出在中间挂起,直到子程序退出,此时输出的其余部分将打印到屏幕上。有没有更好的方法来完成我需要做的事情?

在此先感谢。

回答

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

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

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

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

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

我希望这有助于。

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

0

使用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 
2

我会做线沿线的东西:

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