环境:armv7l GNU/Linux Debian Jessie、GNU bash
、v4.3.30(1)-发布(arm-unknown-linux-gnueabihf)。
do_stuff
:一个长时间运行的进程,生成到 STDOUT 的输出compare_output.pl
:perl
根据输出执行操作的脚本。
我希望能够重新启动,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