SHIBUYA 3%

(元在宅が)渋谷で働くエンジニアの備忘録的memo & 雑記 - ココロはいつもSHIBUYAに在り

シェルと排他制御メモ

↓どこかで見つけたサンプル。。

#!/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文字分の値を表す

ステップ・バイ・ステップ・シェルスクリプト(5):シェルの変数に慣れる - @IT

Linuxのシェルスクリプト変数の記号あれこれ - 気まぐれな備忘録(仮)


数値演算子
数値評価演算子 意味
数値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より小さいか等しい場合に真(<=)

シェルスクリプト入門 [演算・比較]