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

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

假設正在後台運行 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

相關內容