すでに実行中のPerlScriptを多重起動しないようにしたい!(Proc::ProcessTable)
2013年9月9日
イメージとしては、ps auxを叩いて同じ実行ファイルを探して、pid見て、その後の処理をするかどうか判定すればいいかなーって感じですかね。
で、ぐぐったら「Proc::ProcessTable」ってなモジュールがあったので、これ使ってみます。
use strict; use warnings; use utf8; use Proc::ProcessTable; my $p = Proc::ProcessTable->new(); # 起動した時のPID(自分自身のPID) my $pid = $$; # $p->tableで配列リファレンスが返るので、全部チェック。 for ( @{ $p->table } ) { # コマンドが「perl check.pl」+ pidが自分と違う -> 他のプロセスで実行中 -> 自身は終了 die if ( $_->{'cmndline'} =~ /perl\scheck\.pl/ && $pid != $_->{'pid'} ); } # 以下、重複したくない処理...
ま、ホントはジョブキュー(TheSchwartzとか、Gearman)とか使って、制御した方がいいんでしょうかね。
今回の要件は、
「crontabで起動するscriptがあって、前回の処理が終わってない場合は、処理しない」
だったので、これでいいか・・。