从 while 循环通过管道传输到一个命令,但如果管道命令失败则执行另一个命令

从 while 循环通过管道传输到一个命令,但如果管道命令失败则执行另一个命令

环境:armv7l GNU/Linux Debian Jessie、GNU bashv4.3.30(1)-发布(arm-unknown-linux-gnueabihf)

  • do_stuff:一个长时间运行的进程,生成到 STDOUT 的输出
  • compare_output.plperl根据输出执行操作的脚本。

我希望能够重新启动,compare_output.pl以防进程compare_output.pl中断(死亡)。即使是一个简单的循环echo之后while(以及之后compare_output.pl),也是不成功的。

遗憾的是,我不知道如何在bash.保留do_stuff进程的缓存/缓冲的奖励。

while true;
do
  ...
  do_stuff (which generates lot of output linewise to STDOUT)
  ...
done | compare_output.pl 
#then something like this should happen, while retaining 
#the while loop and being able to "reattach" to the pipe.
"compare_output died? restart it "

有时compare_output.pl会破裂(实际上会死掉),从而丢失整个管道输入。 (不用说不compare_output.pl应该打破,但那是另一天的另一个问题)。

compare_output中断时,我希望能够重用 while 循环,以便能够重新连接到管道输出。丢失一行或几行是可以接受的。

我尝试使用命令替换而不是管道:

while true;
do
  ...
  do_stuff (which generates lot of output linewise)
  ...
done < <( compare_output.pl )
# then something like this should happen, while retaining
# the while loop and being able to "reattach" to the pipe.
compare_output died? restart it "

restart_while_loop万一compare_output.pl失败(死亡)

阅读并改编自 Bash:无法跳出管道“while read”循环;流程替代工程

除了阻碍输出之外,这似乎无法解决我想在compare_output.pl死后采取行动的问题。

当我这样做的时候CTRL-C然后 myecho test被执行,这是我执行的而不是compare_output.pl restart test.

否则do_stuff仍然运行很长时间。

除此之外,我确实阅读了有关管道和流程替代的内容,这里有很多问题,但我似乎缺乏合适的关键字来搜索。

我知道 为什么使用 shell 循环处理文本被认为是不好的做法? 并明白我这样做的方式是不好的做法,但这是我目前无法改变的情况。

那么我怎样才能在死后尽快让事情发生呢compare_output.pl? (进程停止运行,无ps条目)

如果这应该是使其实际工作的唯一选择,我愿意对循环进行完全重写。目前我不想使用其他脚本语言,但如果有必要,我(以某种方式)可以重写它,perl但不想这样做。

答案1

将第一个循环输送到另一个循环中:

while :; do ./do_stuff ; done | 
  while :; do ./compare_output.pl ; done

相关内容