所以这可能是一个简单的问题,但我不是一个重击程序员而且我无法解决这个问题。
我们有一个闭源程序,它调用一个子程序,该子程序一直运行直到它退出,此时程序将再次调用子程序。这无限期地重复。
不幸的是,主程序有时会在一段随机时间后自发地(并且反复地)无法调用子程序。最终的解决方案是联系原始开发人员以获得支持,但与此同时我们需要一个快速的修补程序来解决这个问题。
我正在尝试编写一个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语句中删除了前导空格,并且回声输出在中间挂起,直到子程序退出,此时输出的其余部分将打印到屏幕上。有没有更好的方法来完成我需要做的事情?
提前致谢。
答案 0 :(得分:3)
我会按照以下方式做点什么:
stdbuf -o0 ./program1 | grep --line-buffered "some string" | (read && reboot)
答案 1 :(得分:0)
您需要引用$ line变量,即所有引用的"$line"
*(read line
位除外)。
您的program1
可能是'暂停'数据的来源。它需要flush
其输出缓冲区。你可能无法控制,所以
一个。检查您的系统是否有unbuffer
命令可用。如果是这样,请尝试unbuffer cmd1 | watcher
您可能需要尝试使用哪个cmd包裹unbuffer
,也许您必须做cmd1 | unbuffer watcher
。
湾或者你可以尝试将观察者包装为一个过程组,(我认为这是正确的术语),即
./program1 | { ./watcher.sh ; printf "\n" ; }
我希望这会有所帮助。
P.S。因为您似乎是新用户,如果您得到的答案可以帮助您,请记住将其标记为已接受,并且/或者给它一个+(或 - )作为有用的答案。
答案 2 :(得分:0)
使用read
的{{1}}变量,我建议使用$REPLY
代替printf
echo