根据终端输出重新启动可执行文件

根据终端输出重新启动可执行文件

背景故事:我正在使用一个使用 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

相关内容