PIDの待機とリサイクル

PIDの待機とリサイクル

スクリプトでバックグラウンドで実行されている関数の並列バージョンを呼び出し、待機を実行するかどうかを心配しています。

a () {
  sleep $1
}

a 10 &
PIDs="$PIDs $!"
a 50000 &
PIDs="$PIDs $!"

wait $PIDs   

問題は、最初の関数呼び出しには10秒(sleep 10)がかかりますが、2番目の関数呼び出しはほぼ14時間(sleep 50000)かかることです。

最初の呼び出しのPIDがリサイクルされ、14時間後に2番目の呼び出しが終了すると、そのPIDが別のプロセスで使用されているため、スクリプトが続行されないかどうか心配されます。または、呼び出しが完了するとすぐにリストから最初のPIDを削除し、2つのプロセスが最終的に完了するのを待たずに2番目のプロセスが完了するのを待ちますか?

ベストアンサー1

wait組み込み関数がランダムプロセスを待つのではなく、現在のシェルのサブプロセスのみを待っていることを直接確認してください。

#!/bin/bash
sleep 2 &
P=$!
echo sleeping 3 seconds...
sleep 3
echo waiting for $P ...
wait $P
R=$RANDOM
echo waiting for $R ...
wait $R
echo done

$ ./t.sh
sleeping 3 seconds...
waiting for 93208...     ## this returns immediately, since that PID is gone
waiting for 31941 ...
./t.sh: line 10: wait: pid 31941 is not a child of this shell
done

おすすめ記事