プロセスを監視する

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