とりあえず SIGINT ほってからしばらくして止まってなかったら諦めて SIGKILL とかどうするのとか。

なんかレポート採点システムで昔やったなぁ、と思ったけど、ちょっと違うような気もする。

#!/usr/local/bin/ruby

pid = fork {
  exec ARGV[1]
}

Thread.start {
  sleep(ARGV[0].to_i)

  20.times {
    Process.kill(2,pid)
    sleep(0.1)
  }
  Process.kill(15,pid)
}

Process.waitpid()

これを適当に保存しておいて、

exec "./limit 3 'gosh -I /tmp/reports/200101225 test.problem-1-1.scm'"

とかすると、最大3秒待ってから、SIGINTして、ダメだったらSIGKILLする、という感じ。

なんで20回もSIGINTしてるのか、微妙に謎。それ以前に、SIGINTしてもgoshは死んでくれないので、なんでSIGINT送ってるのかも謎。そもそも、waitpidが全スレッドをブロックしないRubyはできる子だったんだなぁ、とか思った。



今試したら、

Process.kill(2, pid)
sleep(1)
Process.kill(15, pid)

で大丈夫くさかった。

waitpidでちゃんとpidだけを待つようにすれば、普通にプログラムの中から使えるんだろうか。