我可以等待命令中的所有分叉进程完成吗?

我可以等待命令中的所有分叉进程完成吗?

假设正在后台运行 FOO 为 BAR 星标。如何在 shell 中等待 BAR 完成?我想要一个不改变 FOO 内部结构的解决方案(尽管我可以勉强改变 BAR 的内部结构)。

FOO

# Somehow wait on all forked processes of FOO

echo FOO and BAR have finished.

PS:我想到的具体用例是等待 Aria2 运行使用的脚本,—-on-download-complete但我希望能够尽可能普遍地解决这个问题。

答案1

您可以使 BAR 将其 PID 输出到文件中;然后检查直到具有该 PID 的进程不再运行。像这样的东西:

在 BAR.sh 上:

#!/bin/bash
(echo $$)>/tmp/BAR.pid
...

在 runFOO.sh 上:

#!/bin/bash
# possibly remove pid from previous run:
if [ -f /tmp/BAR.pid ]; then
  rm /tmp/BAR.pid
fi

# launch FOO
./FOO.sh &

# make sure BAR has started:
while [ ! -f /tmp/BAR.pid ]; do
  sleep 1
done

# wait for BAR to finnish: 
while [ $(kill -s 0 $( cat /tmp/BAR.pid ) 2>&1 | wc -l) -eq 0 ]; do
  sleep 1;
done

相关内容