flock によるロック機構

flockでshellの多重起動を防止する仕組みについて考えてみた - Qiita

0,15,30,45 8-20 * * * flock -n /tmp/somthing.lock something.sh
#!/bin/bash

exec 9>/tmp/$(basename $0 .sh).lock
flock -n 9
if [ $? -ne 0 ]; then
    exit 1
fi

flockはデフォルトで排他ロックを取得します。排他ロックは共有ロックも排他ックも受け付けないので、次にflockを同じファイルに対して実行すると待ちになります。

方法1と方法2では両方-n オプションを指定していますが、これはロック待ちが発生しても待たずに終了するオプションなので、ロック中に実行されたら強制的に処理を終了することになります。

exec について

現行のジョブに置き換えてコマンドを実行する仕組み

例のスクリプトでは実行プロセスが FD 9 でロックファイルを掴むようになっている。

$ ls -al /proc/{pid_1}/fd
合計 0
dr-x------ 2 some-user some-user  0  2月 21 22:22 .
dr-xr-xr-x 9 some-user some-user  0  2月 21 22:22 ..
lrwx------ 1 some-user some-user 64  2月 21 22:22 0 -> /dev/pts/0
lrwx------ 1 some-user some-user 64  2月 21 22:22 1 -> /dev/pts/0
lrwx------ 1 some-user some-user 64  2月 21 22:22 2 -> /dev/pts/0
lr-x------ 1 some-user some-user 64  2月 21 22:22 255 -> /tmp/sleep_1.sh
l-wx------ 1 some-user some-user 64  2月 21 22:22 9 -> /tmp/sleep_1.lock

255は実行ファイルが割り当てられるようです。

execコマンドでFDをファイルにリダイレクトするとFDが割り当てられる プロセス毎に独立してる