シェルと排他制御メモ
↓どこかで見つけたサンプル。。
#!/bin/sh LOCKFILE=test.lock lockfile -r 0 $LOCKFILE # evaluate return code if [ $? -ne 0 ]; then echo "Command aborted" # error終了 exit 1 fi # do something exclusive command echo "important command" # unlock rm $LOCKFILE # 正常終了 exit 0
消すかどうか聞かれないようにするには、-f
オプションを付けると、このようなときにユーザに問い合わせることなく消去される。
override r--r--r-- tomo/staff for test.lock?
ファイルがロックされている時error:73が返され、$?
で取得し判定する。
file-system error 73 ("file is locked")
lockfile -option
sh if lockfile -10 -r 5 -l 100 $LOCKFILE then ・・・・・ fi
-10:ロックファイル (test.lock) が存在すれば10秒待つことを表します。-r 5:上記を5回繰り返す。その間にロックファイルが無くなればロックファイルを作成して成功とし、ロックファイルが無くならなければ失敗とする。
-l 100:存在するロックファイルが作成後100秒以上経過していた場合、ロックファイルを削除して新たにロックファイルを作成して成功とする。
MEMO
シェルでミリ秒を表示
echo $(printf '%ld000' $(expr `date +%s`))
シェル変数の記号
表記 | 意味 |
---|---|
$NAME | 変数NAMEを表す |
$1, $2, …, $9 | 各引数を表す。順に1番目、2番目、…、9番目を意味する |
${10}, ${11}, … | 10番目、11番目、… の引数を意味する |
$0 | 実行されたシェルスクリプトの実行ファイル名を表す |
$# | 実行時に与えられた引数の数を表す |
$@ | 引数をスペース区切りで表す |
$* | $@ とほぼ同じ。引数を環境変数IFSで区切って表す。IFSが空の場合、スペース区切りとなる。IFS=: を指定するとa:b:c:d となる。 |
$? | 直前に実行された処理の終了コード値を表す。これを使って実行されたコマンドが正しく終了したかどうか判定します。 |
$$ | 実行中のシェルのプロセスID値を表す |
$! | 直前に実行された処理のプロセスIDを表す |
${NAME:-VALUE} | 変数NAMEが空の場合、値VALUEが設定される |
${NAME:=VALUE} | 「${NAME:-VALUE}」と同じ |
${NAME:+VALUE} | 変数NAMEが空でなければ、値VALUEが設定される |
${NAME:?VALUE} | 変数NAMEが空の場合、値VALUEを標準エラーに出力し、スクリプトの実行を終了する |
${NAME:START} | 変数NAMEのSTART番目以降の値を表す |
${NAME:START:LENGTH} | 変数NAMEのSTART番目からLENGTH文字分の値を表す |
数値演算子
数値評価演算子 | 意味 |
---|---|
数値1 -eq 数値2 | 数値1と数値2が等しい場合に真(=) |
数値1 -ne 数値2 | 数値1と数値2が等しくない場合に真(!=) |
数値1 -gt 数値2 | 数値1が数値2より大きい場合に真(>) |
数値1 -lt 数値2 | 数値1が数値2より小さい場合に真(<) |
数値1 -ge 数値2 | 数値1が数値2より大きいか等しい場合に真(>=) |
数値1 -le 数値2 | 数値1が数値2より小さいか等しい場合に真(<=) |