假设正在后台运行 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