参考サイト
モチベ
プロセスグループとCtrl+Cの関係がよくわからなかったので調べてみた。
結論
pgroup: false だと子プロセスにも SIGINTを送信する
pgroup: true だと子プロセスには SIGINTは送信しない
プロセスグループなしで spawn
以下のプログラムを動かすとします。
a.rb
spawn "ruby b.rb" begin sleep rescue Interrupt puts "interrupt a.rb" exit(false) end
b.rb
begin sleep rescue Interrupt puts "interrupt b.rb" exit(false) end
ruby a.rb を実行した後、Ctrl+C を押します。出力は以下のような感じなると思います。
^Cinterrupt b.rb interrupt a.rb
どちらも終了します。
プロセスグループありで spawn
先ほどの a.rb の spawn に pgroup: true オプションを付けます。これを付けると b.rb が a.rb とは別のプロセスグループで動作するようになります。
a.rb
spawn "ruby b.rb", pgroup: true # ← pgroup: true オプションを追加 begin sleep rescue Interrupt puts "interrupt a.rb" exit(false) end
先ほどと同様に ruby a.rb を実行した後、Ctrl+C を押します。出力は以下のような感じになると思います。
^Cinterrupt a.rb
ps aux | grep ruby をすると ruby b.rb のプロセスが残っているのがわかります。
以上