所以这可能是一个简单的问题,但我不是一个重击程序员,我无法弄清楚这一点.
我们有一个闭源程序,它调用一个子程序,该子程序一直运行直到它退出,此时程序将再次调用子程序.这无限期地重复.
不幸的是,主程序有时会在一段随机的时间后自发地(并且反复地)无法调用子程序.最终的解决方案是联系原始开发人员以获得支持,但与此同时我们需要一个快速修补程序来解决此问题.
我正在尝试编写一个bash脚本来监视程序的输出,当它看到一个特定的字符串时,它将重启机器(程序将在启动时自动重新运行).bash脚本需要将所有标准输出传递到屏幕,直到它看到特定的字符串.该程序还需要继续处理用户输入.
我尝试了以下但成效有限:
./program1 | ./watcher.sh
Run Code Online (Sandbox Code Playgroud)
watcher.sh基本上只是以下内容:
while read line; do
echo $line
if [$line == "some string"]
then
#the reboot script works fine
./reboot.sh
fi
done
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但在echo语句中删除了前导空格,并且回声输出在中间挂起,直到子程序退出,此时输出的其余部分将打印到屏幕上.有没有更好的方法来完成我需要做的事情?
提前致谢.
您需要引用您的 $line 变量,即"$line"所有引用*(除了read line位)。
您的program1可能是“暂停”数据的来源。它需要flush它的输出缓冲区。你可能无法控制它,所以
A。检查您的系统是否有unbuffer可用的命令。如果是这样尝试,unbuffer cmd1 | watcher您可能必须尝试使用哪个 cmd 来包装unbuffer,也许您必须这样做cmd1 | unbuffer watcher。
b. 或者您可以尝试将观察者包装为进程组,(我认为这是正确的术语),即
./program1 | { ./watcher.sh ; printf "\n" ; }
我希望这有帮助。
PS,由于您似乎是新用户,如果您得到的答案对您有帮助,请记住将其标记为已接受,和/或给它 +(或 -)作为有用的答案。