如何确定是否有任何后台进程是在shell中完成的,以及它们经过的时间?

如何确定是否有任何后台进程是在shell中完成的,以及它们经过的时间?,shell,parallel-processing,Shell,Parallel Processing,我有8个并行运行的后台进程(也是shell脚本),我将它们命名为run1.sh,run2.sh。。。因此,主要流程如下所示: #main.sh ./run1.sh & ./run2.sh & ./run3.sh & ... ./run8.sh & 我想确定这8个过程中的每一个是否都已完成,并计算每个过程完成时经过的时间。因此,先运行run1.sh并不能保证它会先完成。您可以尝试: #main.sh time ./run1.sh & time ./run2

我有8个并行运行的后台进程(也是shell脚本),我将它们命名为
run1.sh,
run2.sh
。。。因此,主要流程如下所示:

#main.sh
./run1.sh &
./run2.sh &
./run3.sh &
...
./run8.sh &
我想确定这8个过程中的每一个是否都已完成,并计算每个过程完成时经过的时间。因此,先运行
run1.sh并不能保证它会先完成。

您可以尝试:

#main.sh
time ./run1.sh &
time ./run2.sh &
time ./run3.sh &
...
time ./run8.sh &
wait
echo "Done"

在执行类似操作时,我将进程id保存在一个数组中:

#!/bin/bash

declare -a pids

idx=0
while test $idx -lt 4; do
  ./run.sh &
  pids[$idx]=$!
  idx=$(($idx+1))
done
您还可以设置其他数组以保存开始时间或需要跟踪的任何其他信息。然后设置另一个循环以检查已完成的进程。此循环将根据您的退出条件进行更改

done=0
while test $done -lt 4; do
  idx=0
  while test $idx -lt 4; do
    pid=${pids[$idx]}
    if [[ $pid -ne 0 ]]; then
      kill -0 $pid
      if [[ $rc -ne 0 ]]; then
        $pids[$idx]=0  # completed.
        done=$((done+1)
      fi
    fi
  done
  sleep 1
done

此代码需要阵列支持,但并非在所有shell中都可用(问题仅标记为
shell
)。