bash wait仍在等待终止的(管道式)进程

时间:2018-07-02 07:29:46

标签: bash

我有一个与此类似的bash脚本:

#!/bin/sh -x
...
midori -e Fullscreen -a "myurl" 2>&1 | grep -qe "===RESTART===" &
GREP_PID=$!

.. do other stuff with midori etc.

#wait until midori send ===RESTART===
echo Wait for $GREP_PID
wait $GREP_PID
killall -TERM midori
...

其中大多数都能按预期工作。但是最新的wait不会在grep进程终止后解除阻止。我已与pstree检查了运行过程。所以midori和grep是startet正确的。稍等片刻之后,发送===RESTART===grep进程终止(greppstree中不再可见)。但是wait从未结束。

这是什么原因? grep进程终止后,如何“强制”继续等待?

2 个答案:

答案 0 :(得分:1)

不确定您的$GREP_PID是否包含正确的值。试试:

(midori -e Fullscreen -a "myurl" 2>&1 | grep -qe "===RESTART===")&

答案 1 :(得分:1)

请参见以下示例:

[STEP 105] # sleep 1000 | sleep 10 &
[1] 45230
[STEP 106] # echo $!
45230
[STEP 107] # ps p 45230
   PID TTY      STAT   TIME COMMAND
 45230 pts/8    S      0:00 sleep 10
[STEP 108] #

我们可以看到,对于command1 ... | command2 ... &$!command2的PID。因此,当wait $!完成时,只有command2已经退出,command1可能仍在运行。因此,如果您要同时等待command1command2,则应该使用职位ID %%%1%2 ,...)。或者,您可以只运行wait(不带参数)来等待所有作业。