とあるシステムで親プログラムからforkで子プログラムを起動させ、頃合いをみて親プロセスがその子プロセスをkillするという処理を実装した。しかしpsコマンドでプロセスの状態を確認すると、子プロセスで動作させたと思われるプログラムが
defunct ..
defunct ..
defunct ..
と残りまくり。これは何かと訪ねたら調べてたら、どうやら親プロセスでforkして子プロセスを起動すると、親にてProcess.waitを呼ばないとゾンビ(defunct)になってしまうとのこと。
これを回避するには子プロセスに対してProcess.detachを行ってから、Process.killを行う。
例えば
pid = fork do 何か処理 end Process.detach(pid) Process.kill(:INT, pid)
な感じ。