所以这可能是一个简单的问题,但我不是一个bash程序员,我也不能解决这个问题。
我们有一个闭源程序,它调用子程序,该子程序一直运行到退出,此时程序将再次调用子程序。这会无限期地重复。
不幸的是,在一段随机的时间之后,主程序有时会自发地(并且反复地)无法调用子程序。最终的解决方案是联系原始开发人员以获得支持,但在此期间,我们需要一个快速的热修复问题。
我正在尝试编写一个bash脚本,它将监视程序的输出,当它看到特定的字符串时,它将重新启动机器(程序将在引导时再次自动运行)。bash脚本需要将所有标准输出传递到屏幕上,直到它看到特定的字符串。程序还需要继续处理用户输入。
我尝试了以下几种方法,但只取得了有限的成功:
./program1 | ./watcher.shwatcher.sh基本上就是这样的:
while read line; do
echo $line
if [$line == "some string"]
then
#the reboot script works fine
./reboot.sh
fi
done这看起来工作正常,但是echo语句中的前导空格被去掉了,echo输出挂在中间,直到子程序退出,此时输出的其余部分被打印到屏幕上。有没有更好的方法来完成我需要做的事情?
提前谢谢。
发布于 2011-09-07 06:42:19
我会做一些类似这样的事情:
stdbuf -o0 ./program1 | grep --line-buffered "some string" | (read && reboot)发布于 2011-09-07 03:29:41
"$line" *(除了read line位)。program1可能是'paused‘数据的来源。它需要flush它的输出缓冲区。你可能无法控制它,所以检查您的系统是否有可用的unbuffer命令。如果是这样的话,尝试使用unbuffer cmd1 | watcher,您可能必须尝试使用哪个命令来包装unbuffer,也许您将不得不使用cmd1 | unbuffer watcher。
或者,您可以尝试将watcher包装为一个进程组(我认为这是正确的术语),例如
./program1 | { ./watcher.sh ; printf "\n" ; }
我希望这能帮到你。
附注:当您看起来是一个新用户时,如果您得到了一个对您有帮助的答案,请记住将其标记为已接受,并/或给它一个+(或-)作为有用的答案。
发布于 2011-09-07 06:27:39
使用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
donehttps://stackoverflow.com/questions/7324588
复制相似问题