spawnとCtrl+C

参考サイト

equj65.net

モチベ

プロセスグループと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.rbspawnpgroup: true オプションを付けます。これを付けると b.rba.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 のプロセスが残っているのがわかります。

以上