プロセス間の期限付き排他ロック

追記 2013-03-01

つづきを書きました。

追記 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 よりよい名前
  • 実装の妥当性に対するご意見
  • その他、はげましのお便り