プロセスを監視する

GAのためにクライアントを何万回も走らせてるんだけど、数百回に1回、なぜかクライアントが死なない(暴走する)。原因もよくわからないし、再現を待ってるほど暇じゃないので、スマート(嫌味)に解決することにした。すなわち、n秒以上動いている特定のプロセスを殺すスクリプトをcronで回す。なんて美しい手法。orz

use Proc::ProcessTable; $t = new Proc::ProcessTable; my $i = 0; foreach $p ( @{$t->table} ){ if ($p->cmndline =~ ‘program_name’){ if (time() - $p->start > 10){ system(‘pkill -9 program_name’); print “killed “, $p->cmndline, “\n”; } } }

これで、10秒(6行目)以上動いてるprogram_nameというプロセスがあれば殺せる。これを1分ごとに回せば、たまに暴走してるプロセスがあっても無駄なく進められるだろう。GA回してるプログラム側からは、結果のファイルopenの例外を拾ってスコアを0にしてしまえば良い。さしずめ突然死というところか。結果にどの程度影響があるのかは知らん。

あと、数階層下まで一気にディレクトリを作りたいときは、mkdirじゃなくてmkpathを使うといいらしい。

use File::Path; if (!-d $dir){ mkpath($dir); }

これで$dirが無いときは作れる。