僕が現時点で一番いいと思う方法は、シンボリックリンク自身に プロセス番号の情報を埋め込み、もしリンク作成できなかったら リンク先を調べて、さらに「/proc/プロセス番号」が存在するか どうかチェックする、ってのです。もし/proc/プロセス番号 が あれば、本当に実行中なわけですが、存在しなければ誤って ロック情報だけが残ってしまったわけで。 また、 $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish; sub finish{ ロックファイルを削除;exit; } などと書くことで、誰か(WWWサーバなど)にシグナルを送られて プロセスを止められた場合にも、ロックファイルの後始末だけは 行って終了できます。 ただ、うちのカウンタはいろいろ試しているんですが、いまいち…です。 # CGIの場合、排他処理の失敗自体がたまにしか起きないので、 # 動作チェックしにくいですよね。 例えばこんな感じ。 BEGIN { &lock_on; } END { &lock_off; } sub lock_on { $SIG{TERM}=$SIG{INT}=$SIG{HUP}=$SIG{QUIT}=\&lock_off; my $lock_flg = 0; LOOP: foreach ( 1..3 ){ foreach ( 1..5 ){ $lock_flg = symlink("$$",$lockfile); if ( $lock_flg ){ last LOOP; } sleep 1; } if ( ! $lock_flg ){ if ( ! -f "/proc/".readlink($lockfile) ){ # なぜかロックファイルが残ってた 各種整合性のチェック; unlink($lockfile); } } } if ( ! $lock_flg ){ print "ロックファイルを作成できませんでした。\n"; exit; } } sub lock_off { unlink($lockfile); その他の後始末; exit; } > そうですか、まだ「これ!」ってセオリーは無いんですね(^^ゞ たぶんセオリーはあるんでしょうけど、僕が知らないだけです(^^; > hogeの前は「エンマーク」でいいのですよね。 全角の「¥」ではないですよ。半角の「\」です。 エンマークかバックスラッシュかは、表示される環境によります。 |