とりあえず 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だけを待つようにすれば、普通にプログラムの中から使えるんだろうか。