メモの日々


2017年05月29日(月) [長年日記]

[shell][unix] flockコマンドを使用して二重起動を防ぐ

Linux上でコマンドの二重起動を防ぐにはどうするか。flockコマンドを使うのがよさそう。

flockコマンドは指定ファイルをロックしてコマンドを実行するコマンド。-n オプションによりロック中の場合は直ちに処理を終了できる。

$ flock -n lock echo hello

flockにはファイルではなくファイルディスクリプタを指定することもできて、この場合はそのファイルディスクリプタを閉じるまでロックが維持される。シェルスクリプトの中で排他制御を行うときはこのモードを使とよい。シェルスクリプト自身を入力用にオープンしてロックするのがお手軽。

#!/bin/bash
set -e

(
    flock -n ${my_fd} || exit 1
    sleep 5
    echo hello
) {my_fd}< "$0"

echo world

ここで、「{my_fd}<」というのは使用するファイルディスクリプタ番号を自動で決めるための記法。Bashのマニュアルのリダイレクトの節に説明がある。

二重起動防止の用途ならサブシェルを使わない方が分かりやすいかな。

#!/bin/bash
set -e
exec {my_fd}< "$0"
flock -n ${my_fd}
sleep 5
echo hello
echo world

参考