プロセスグループの一括終了
10月8日の日記の続きで、SHOUTcastPlayerから派生したプロセスを一括して終了させる方法がないかと書いたところ、コメントを頂いて実現することができました。
なんでこんなことに拘ったかというと、現状ではSHOUTcastPlayerの終了時にsleep 35というプロセスを一緒に終了させるためにpsの出力をgrepしてpidを取得してkillするという手段を採っています。ところが、この方法だと全く関係ないsleep 35のプロセスが存在した場合にも誤って終了させてしまうのが問題だと思ったからです。
Rubyスクリプトからシェルスクリプトを起動させると同じプロセスグループに属するようになるみたいですね(というかRubyに限らず普通そうなるのか)、今回プロセスグループという言葉自体初めて知りました。
通常はpidが属するプロセスグループを一括終了させるには
kill -- -pid
の様にします。同じことをRubyでは
Signal.trap("TERM") {exit} Process.kill("-TERM", $$)
のように書くみたいです、ちなみに$$は自分自身のpidです。
ところがこのRubyスクリプト、ターミナルからを起動するとちゃんと動作するのですがアイコンから起動するとプロセスグループに属する他のプロセスが終了しません。Qtopiaの環境を通ることでプロセスグループの情報?が無くなってしまうみたいです。
そこで助言を頂いてRubyスクリプトの冒頭に
Process.setpgrp
を追加してプロセスグループを明示的に設定したところ、見事プロセスグループの一括終了ができるようになりました。これで関係ないプロセスを誤って終了させることが無くなりました。
なかだ様には長い間お付き合いいただきまして、本当にありがとうございましたm(_ _)m