Spawn を使用するために、Ruby on Rails サーバー (Linux で実行中) の並行処理を少しリファクタリングしています。Spawn::fork_it
ドキュメントは、分離された後も、フォークされたプロセスを待機できると主張しています: https://github.com/tra/spawn/blob/master/lib/spawn.rb (186行目):
# detach from child process (parent may still wait for detached process if they wish)
Process.detach(child)
ただし、Ruby のProcess::detach
ドキュメントには、これを行うべきではないと書かれています: http://www.ruby-doc.org/core/classes/Process.html
一部のオペレーティング システムは、親がそのステータスを収集するまで、終了した子プロセスのステータスを保持します (通常、wait( のバリアントを使用)。親がこのステータスを収集しない場合、子プロセスはゾンビ プロセスとして残ります。Process::detach は、終了時にプロセス pid のステータスを取得することを唯一の仕事とする個別の Ruby スレッドを設定する子プロセスの終了を明示的に待機するつもりがない場合にのみ、detach を使用してください。
しかし、Spawn::wait
効果的にラップすることでそれを行うことができますProcess::wait
。Process::waitpid2
ちなみに、メソッドを使用する代わりに、メソッドを使用して子プロセスを待機することを特に望んでいますSpawn::wait
。
デタッチ アンド ウェイトは Linux で正しく動作しませんか? これにより、切り離された死神スレッドと待機中の親プロセスの間で、誰が最初に子ステータスを収集するかという競合状態が発生する可能性があることが懸念されます。