背景故事:我正在使用一个使用 CMake 进行多个构建选项的软件。在我的桌面构建系统上,当我执行“处理器重置”命令时,程序会干净地退出,但需要使用一组不同的参数重新启动。 (该功能在硬件上可以正常工作,因此我不想修改底层源代码。)
问题:我的问题是,如何监视程序的终端输出,并在看到“已收到处理器重置”时触发程序的新实例?
注意事项
- 我的首选答案是在 shell 脚本中执行此操作,但我对其他想法持开放态度。
- 我不希望有任何递归。
一般流程
通过上电复位启动程序
./program -PO
(程序运行并将输出打印到终端)
发送处理器重置命令
程序接收处理器复位命令,打印相关信息,并终止
监视器程序读取到原始程序已因处理器重置而终止,并使用不同的标志再次运行该程序。
./program -PR
我尝试过的事情
我有一个部分有效的解决方案......很有趣。似乎有一些奇怪的缓冲正在进行,我试图禁用它们,尽管没有成功。但是 - 它确实成功解析了程序的终端输出,并在必要时执行处理器重置标志(尽管只有一次,因为它不在循环中。)
stdbuf -o0 -i0 -e0 sudo ./program -PO | tee /dev/tty | (grep "Processor Reset.") | (read && sudo ./program -PR)
回顾一下
- 我需要代码不缓冲大块数据(即在生成输出时顺利写入)
- 它应该包含在一个循环中以允许多个处理器重置。 (任何其他重置都应终止循环。)
答案1
如果你有一个像这样的 shell 脚本怎么办:
$ cat top.bash
#!/bin/bash
echo "launched top.bash"
./fakeprog1.bash | grep -q "Processor Reset Received" && exec ./fakeprog2.bash
您可以将 替换./fakeprog1.bash
为您的./program -PO
并替换./fakeprog2.bash
为您的./program -PR
。
当我调用我的版本时,它的运行方式如下:
$ ./top.bash
launched top.bash
launching /root/453742/fakeprog2.bash
回fakeprog1.bash
显一条消息,但我们看不到它,因为它被grep
.日志可以通过以下方式定向到文件+此脚本,tee
因此这不应该成为问题。
答案2
感谢 slm 为我指明了正确的方向!
# Start the program with Power-On Reset
# Use tee to print output to terminal and pipe to grep
# grep returns 0 if the string is found
sudo ./program -PO | tee /dev/tty | grep -q "Processor Reset."
# Store the grep exit code in a variable
result="$?"
# If result is 0, grep found the Processor Reset string
if [ "$result" == "0" ]; then
while : ; do
sudo ./program -PR | tee /dev/tty | grep -q "Processor Reset."
result="$?"
# This loop will continue as long as the Processor Reset string is found
# once the program terminates
[ "$result" == "0" ] || break
done
fi