我有8個後臺進程(也Shell腳本)並行運行,我的名字他們run1.sh,
run2.sh
......所以今天的主要過程如下所示:如何確定是否有任何後臺進程在shell中完成並且它們的運行時間?
#main.sh
./run1.sh &
./run2.sh &
./run3.sh &
...
./run8.sh &
我想,以確定是否這些8個進程完成並計算完成後每個過程耗費了多少時間。所以首先運行run1.sh
並不能保證它會先完成。
我有8個後臺進程(也Shell腳本)並行運行,我的名字他們run1.sh,
run2.sh
......所以今天的主要過程如下所示:如何確定是否有任何後臺進程在shell中完成並且它們的運行時間?
#main.sh
./run1.sh &
./run2.sh &
./run3.sh &
...
./run8.sh &
我想,以確定是否這些8個進程完成並計算完成後每個過程耗費了多少時間。所以首先運行run1.sh
並不能保證它會先完成。
當我做類似的事情,我保存的進程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
你可以試試:
#main.sh
time ./run1.sh &
time ./run2.sh &
time ./run3.sh &
...
time ./run8.sh &
wait
echo "Done"
此代碼需要數組支持,它可能在所有shell中都不可用(該問題僅標記爲「shell」)。 – chepner