ulock
名前
ulock : 排他制御コマンド
書式
使い方とオプション
Usage
ulock <lock-file> ulock -w <lock-file> <counter-file> ulock -r <lock-file> <counter-file> <command>
Option
--timeout=<sec> --invalid=<sec>
説明
ロックファイルを作成し、排他制御を実現します。
-w/-r オプション無しの場合は完全排他区間を実現します。→ <例1>
-w/-r オプション有りの場合はリード・ライトロックを実現します。→ <例2>
–timeout オプションで command が起動されるまでの待ち時間の最大値を指定できます。-1 を指定すると無限に待ちます。デフォルトは -1 (無限に待つ)です。
–invalid オプションでは、指定した時間が経過したロックファイルの削除を行います。別のプロセスなどが残してしまった、意図しないロックが続いてしまっている状態を解消します。デフォルトは 60 秒です。-1 を指定すると無限に待ちます。
例(その1) 完全排他区間の実現
ulock は排他的に <lock-file> を生成し、削除されるまでの間は他のプロセスの読み書きを抑止することが出来ます。
$ cat lock.sh #!/bin/bash if ulock lock; then # # 読み書きなどの処理 # rm -f lock fi
例(その2) リード・ライトロックの実現
ファイルへの書き込みを行うシェルにて、ライトロックを指定し、ファイルの読み出しを行うシェルにて、リードロックを指定して読み出しを行います。これにより、「読み出し中は書き込み出来ない」「複数プロセスが同時に読み出せる」「書き込み中は読み出しも書き込みも出来ない」というロックを実現します。リード・ライトロックでは <counter-file> の指定が必要になります。
-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. $ 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
補足 異常終了時の復旧方法について
排他区間中でシェルがエラー終了し、デッドロックが発生した場合の復旧処理には特別の注意が必要です。
1)動作現状の確認
まず、
(A)ロックがかかっているファイル
(B)ロックをかけてしまったシェル
(C)ロック解除を待っているシェル
(D)ロックがかかっているファイルをこれから利用する処理
などを全て確認します。特にDが重要です。
2)ロック解除待ちシェルの停止
解除を待っているシェルをkillコマンドなどで停止します。タイムアウトで自動停止する場合には自動で停止したことを確認します。
3)ロックがかかっているファイルをこれから利用する処理の休止
crontabや、webアクセスなどによって実行される処理を休止をします。具体的にはcrontabのコメントアウト、apacheの停止などを行います。
4)ロックがかかっているファイルの確認
当該のファイルが正常な状態であることを確認します。元シェルの走行ログなども参考になるでしょう。
5)デッドロックの解除
「完全排他区間」「リード・ライトロック」共に、手動でlock-fileを削除することでデッドロックが解消されます。
$ rm -f lock
※counterファイルとそのハードリンクは、ulockコマンドが正常に終了している限り、削除の必要はありませんので、排他区間中のエラー停止ではcounterファイルの処置は不要です。
6)復旧
crontabや、webアクセスなどを元に戻します。 場合によってはcrontab指定シェルの手動実行なども必要になります。
Version and Edition
Version : Tue Jun 18 19:00:37 JST 2019
Edition : 1
© 2021 Universal Shell Programming Laboratory site