自分の記録用
環境
さくらレンタルサーバー
Flask 1.1.1
Werkzeug 0.16.0
やりたいこと
クライアントからリクエストがあった際に、
- 親プロセス
- forkで子プロセスを生成
- クライアントに、responseを返す
- 子の終了を待たずに、消滅
- 子プロセス
- クライアントから渡された処理を行う
- 処理終了後、消滅
疑問点
親が先死ぬとゾンビだ孤児だが出ちゃって邪魔らしい?
double fork?みたいなことしなきゃいけないらしい?
といった記述があったので、実際に調べてみた。
結果
ゾンビプロセスとは
処理の終了した子プロセスで、親プロセスのwaitを待っている状態のプロセス。
子プロセスがforkされた段階でプロセステーブルに子プロセスが追加され、親プロセスのwaitをもって子プロセスはプロセステーブルから削除される。
つまり、処理は終了しているが親にwaitで引き取られていないプロセスのこと。
孤児プロセスとは
親プロセスが先に終了してしまい、親のwaitにより引き取られなくなった子プロセスのこと。親プロセスが先に死んでしまった子プロセスは、initプロセスにre-parentingされ、以後initプロセスが親プロセスとなる。
initプロセスは積極的にwaitを実施し、孤児プロセスを終了させる。
まとめ
つまり、親プロセスが常駐プロセスで、いろんなタイミングで子を作り、どのタイミングでwaitを呼べばわからないような場合に、ゾンビプロセスが大量にできてしまいシステムを圧迫する、ということっぽい。
今回実現したい機能では、先に親プロセスがさっさと死ぬため、子プロセスはinitにきちんと引き取られrて終了するだろうから、double forkとかしないでよさげ。
参考ページ
用語のイメージが掴みやすい
まとめとしてわかりやすい
double forkが必要な場合やその理由について
HATENA Blog : Double forkによるプロセスのデーモン化と、ファイル変更時の自動サーバーリロードの実装 (Python)