らくがきちょう

なんとなく

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.