追記 2013-02-27
コメント欄でのやりとりの通り、穴がある(クリティカルセクションに複数プロセスが突入する可能性がある)のでちょっと出直してきます!!
やりたいこと
- プロセス間の排他的実行を制御したい
- 一定時間経過したら実行できるようにしたい
- 例えば、フェイルオーバーを実行するスクリプトは、何度も実行できるとフェイルオーバー/バックを繰り返してフラップするので、一度フェイルオーバーしたら一定時間は実行できないようにしたい
実装
- シンボリックリンクは、その元となるファイルは存在していなくても構わない
- ロック元のプロセスを特定できる情報を持った(存在しない)ファイル名にしておく
- 識別子 + PID
- ロック元のプロセスを特定できる情報を持った(存在しない)ファイル名にしておく
実行例
ttl 10秒でロックを獲得。unlockせずに終了。 $ ./ipc-lock-withttl.pl 2013-02-27T11:00:00 [INFO] Got lock! yay!! at ./ipc-lock-withttl.pl line 20 10秒経過するまでは、再実行してもロックを獲得できない $ ./ipc-lock-withttl.pl 2013-02-27T11:00:03 [CRITICAL] Cannot lock at ./ipc-lock-withttl.pl line 17 $ ./ipc-lock-withttl.pl 2013-02-27T11:00:07 [CRITICAL] Cannot lock at ./ipc-lock-withttl.pl line 17 10秒経過すると、再度ロックを獲得できる $ ./ipc-lock-withttl.pl 2013-02-27T11:00:10 [INFO] Got lock! yay!! at ./ipc-lock-withttl.pl line 20
【募】
- それ○○でできるよ!!
- IPC::Lock::WithTTL よりよい名前
- 実装の妥当性に対するご意見
- その他、はげましのお便り