我有一个与此类似的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
进程终止(grep
在pstree
中不再可见)。但是wait
从未结束。
这是什么原因? grep
进程终止后,如何“强制”继续等待?
答案 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
可能仍在运行。因此,如果您要同时等待command1
和command2
,则应该使用职位ID (%%
,%1
,%2
,...)。或者,您可以只运行wait
(不带参数)来等待所有作业。