参考サイト
モチベ
プロセスグループと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
のプロセスが残っているのがわかります。
以上