ulock <概要> ulock : 排他制御コマンド <書式> Usage : ulock <lock-file> ulock -w <lock-file> <counter-file> ulock -r <lock-file> <counter-file> <command> Option : --timeout=<sec> --invalid=<sec> Version : Thu Oct 22 09:25:28 JST 2015 Edition : 1 <説明> -w/-r オプション無しの場合(ulock <lock-file>)は完全排他区間を実現 します。この場合、ulock は排他的に <lock-file> を生成します。 -w/-r オプション有りの場合はリード・ライトロックを実現します。 -w(ライトロック)の場合は、ulock は排他的に <lock-file> を生成した 上に、<counter-file> のリンクカウントが1になるまで待ちます。 -r (リードロック)の場合、<lock-file> が存在しなくなるまで待ち、 <counter-file> のリンクカウントを1増やします。その後、<command> を 実行し、正常終了したら <counter-file> のリンクカウントを1減らします。 <command> が正常終了しなかった場合は、以下のメッセージを出力し、リン クカウントは増やしたままにします。 Error(282)[ulock] : command '...' failed, file '...' is left. --timeout オプションで command が起動されるまでの待ち時間の最大値を 指定できます。-1 を指定すると無限に待ちます。デフォルトは -1 (無限に 待つ)です。 --invalid オプションで古いロックファイルの削除を行います。デフォルト は 60 秒です。 <例1> 完全排他区間の実現 $ cat lock.sh #!/bin/bash if ulock lock; then # # 読み書きなどの処理 # rm -f lock fi <例2> リードライトロックの実現 $ cat writelock.sh #!/bin/bash if ulock -w lock counter; then # 書き込み処理(例) up3 key=1 master tran > master.new mv master.new master rm -f lock fi $ cat readlock.sh #!/bin/bash ulock -r lock counter cat master <備考> リードライトロックのアルゴリズム -- ライトロック X-- 書き込みロックを取る。(アトミック) X-- カウンタ0まで待つ。 --- 書き込み処理 --- 書き込みロックをはずす。 -- リードロック X-- リンクカウントに1を足す。(アトミック) X-- 書き込みロックされていれば、リンクカウントを戻して、直前へ戻る。 X-- 読むだけの処理 X-- リンクカウントを1減らす (アトミック) ulock では書き込みロックはハードリンクファイル生成の一意性を利用し、 カウンタオペレーションは、ハードリンクファイルのリンク数を利用してい ます。ulock は上記アルゴリズムのうち、X の部分を実装しています。 lock-file counter-file とも NFS 上に作成すれば、各サーバーからのリー ドライトロックが実現します。