スクリプトでバックグラウンドで実行されている関数の並列バージョンを呼び出し、待機を実行するかどうかを心配しています。
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
答え2
私はあなたがLinuxを実行していると仮定します。一方:
kernel.pid_max
デフォルト値/etc/sysctl.conf
は32768で、明示的に定義されていない場合に適用されます。以下を追加してください。
kernel.pid.max = 4000000
修正されたコンテンツを読み込むsysctl.conf
:
# sysctl -p
これはダウンタイムやその他の中断なしに行うことができます。