flock(1)をflock(2)みたいに使いたい
Stray Penguin - Linux Memo (BASH)
ここに書いてあるとおりに実施する
関数定義
# ロック (ロックファイル名) filelock () { exec 9>>$1 flock -x 9 } # アンロック fileunlock () { exec 9>&- }
使い方
echo "HEAVEN OR HELL" filelock /tmp/hoge echo "LET'S LOCK" sleep 10 echo "SLASH" fileunlock
exec 9>>$1
http://chaichan.web.infoseek.co.jp/src/BSH.htm#B13
本を読む execによるリダイレクトで番号を自動で割り振る
ファイルディスクリプタ 9番 を、引数(/tmp/hoge)への追記としてオープンする
この9番へ何か書けばそれは/tmp/hogeへの追記になるが、今回はファイルディスクリプタ取得のためだけに使用する。
読み込み方向だとファイルが無いときに作らないとダメなので、書き込み方向で。追記なのは一応TRUNCATE処理とかさせないため。
flock -x 9
ディスクリプタ 9番 を使って排他ロックする。 これ日本語manに書いてないんだよな・・・
Man page of FLOCK
- Name
- flock - Manage locks from shell scripts
- Synopsis
- flock [-sxon] [-w timeout] lockfile [-c] command...
flock [-sxon] [-w timeout] lockdir [-c] command...
flock [-sxun] [-w timeout] fd
exec 9>&-
ファイルディスクリプタを閉じる。ようするにclose()なのでその時点でflock()は効果を失ってくれる。
用が終わってすぐプログラム終了するなら別に呼ばなくてもいい。