
そのようなディスパッチャ シェル スクリプトがあります。
while read line
do
java TestProg $line &
done < $tasklist
上のゾンビプロセスのWikipediaページと書いてある
親がwaitを呼び出さなかった場合、ゾンビはプロセステーブルに残され、リソースリークが発生します。
上記のスクリプトでは、関数を使用しませんでした(多くのディスパッチャ シェル スクリプトをこの方法で記述しました)。ゾンビ プロセスを防ぐために、次のようにwait
使用する必要があるかどうか疑問に思っています。wait
while read line
do
java TestProg $line &
done < $tasklist
wait
答え1
答えは2つあります:
親が死んだり終了したりすると、プロセスは init によって継承されます。init がそれを実行します。したがって、短期間実行されるプロセスについては心配する必要はありません。アドバイスとしては、wait
または を呼び出す必要がありますexit
。
bash は wait を呼び出して、終了コードをどこかに置くと思います。
wait
終了コードのみを取得し、プロセスを取得します。ゾンビはリソースをほとんど使用せず、プロセス テーブル内のスロット (プロセス ID など) を除いてすべてが解放されます。
ゾンビは死んでいる: プロセス テーブル内のスロットを除くすべてのリソースが解放されます。プロセス テーブル スロットが解放されない理由は、親が (とりわけ) 戻りコードを取得し、プロセス ID (pid) を再使用している別のプロセスに影響を与えることなく、死んだばかりの子に信号を送ることができるためです。