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
参考
- プロセスの多重起動をアドバイザリロックで防止する・改 (Qiita)