go-setlock で多重起動を防止する
setlock を golang に移植した go-setlock を使うと「同じプログラムを連続実行する際、前回分の実行が完了していない場合は次分を実行しない」という制御が可能です。今回は Amazon Linux 上に go-setlock をセットアップするところから使い方までをメモしておきます。
golang のインストール
今回は yum でインストールしてしまいました。
| yum check-update
yum -y install git golang
mkdir ~/.go
echo 'export GOPATH=$HOME/.go' >> ~/.bash_profile
echo 'export PATH=$GOPATH/bin:$PATH' >> ~/.bash_profile
|
go-setlock のインストール
go get でインストールします。
| go get github.com/moznion/go-setlock/cmd/setlock
|
使い方
TEST.sh という名前で「10 秒間スリープした後に文字列を出力する」というテスト用スクリプトを用意します。
| #!/bin/sh
sleep 5
echo 'Hello, World!'
|
予め、ターミナルをふたつ開いておきます。まず、ひとつ目のターミナルで setlock を実行します。
| $ setlock -n -X ./LOCKFILE.lock sh TEST.sh
|
ひとつ目のターミナルが「10 秒間の待機中」に、ふたつ目のターミナルでも setlock を実行します。するとエラーになります。
| $ setlock -n -X ./LOCKFILE.lock sh TEST.sh
unable to lock file: temporary failure
|
ヘルプ
| $ setlock -h
Usage of setlock:
-N (Default.) Delay. If fn is locked by another process, setlock waits until it can obtain a new lock.
-V Show version verbosely.
-X (Default.) If fn cannot be opened (or created) or locked, setlock prints an error message and exits nonzero.
-n No delay. If fn is locked by another process, setlock gives up.
-v Show version.
-x If fn cannot be opened (or created) or locked, setlock exits zero.
|