プロセスを監視する

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が無いときは作れる。

Read more