如何等待除一个子进程外的所有子进程完成执行

如何等待除一个子进程外的所有子进程完成执行

我正在我正在写的脚本的后台启动一些进程。我想在 for 循环的每次迭代结束之前等待其中一些进程完成,但有一个进程需要单独运行和结束。我现在所做的不起作用,因为我似乎耗尽了内存,并且牺牲了越来越多的进程,包括我正在运行的脚本。我目前拥有的是:

loadAvg &
pid=$!
echo "LA pid $pid"
for (( j=0; j < $units_to_fill; j=$((j+1)) )); do
    #Print all files in dir | shuffle file names | delete 1st 1024 files found
    if [ $from_zero -ne 1 ];then
        stat -c %n * | sort -rz | awk -v n=0 '/file_[0-9]*_[abcd].bin/ { if( ++n <= 1024) {print $1 ; }}' | xargs -r rm -f
    fi
    echo "Creating file $j"
    pids=$(writeFile "file_${j}.bin" $src_file $block_size $block_count "${wd}/${dd_log_file}") #Writes a file of (dd) block size 1MB, with 1024 blocks
    for job in `jobs -p`; do
        if [[ $job -ne $pid ]]; then
            echo "Waiting for $job"             
            wait $job
        fi
    done
done
kill $pid

该函数writeFile生成了许多子进程,我无法保证它们退出的顺序,就像我之前所做的wait $!那样

for job in `jobs -p`

我可以捕获函数中生成的子进程的 pid,它们当前以本质上的格式返回pid1 pid2 pid3 ...,但运行wait $pids不起作用,因为某些进程在到达该行之前完成,因此wait出现错误。

注意:我在安装了busybox linux的嵌入式系统上运行,因此它已经被相当削减并且许多标准功能不可用。

答案1

wait命令可以给出多个参数,并且它将等待所有这些进程退出。因此,将所有要等待的PID放入循环中的数组中,然后使用:

wait ${pids[@]}

循环之后。

相关内容