プロセスの多重起動の防止にアドバイザリロックを使えば面倒な後処理を行わなくてもカーネルがよきに計らってくれるのでは? と思って試してみた。
#!/bin/bash
lockfile=/tmp/lockfile
touch $lockfile
exec 9>$lockfile
flock -w 0 -x 9 || {
echo "duplicate process"
exit 1
}
# process...
echo -n "[$$] "
for i in {1..10}; do
echo -n .
sleep 1
done
echo
- touch で lockfile を作る、既にあっても inode は変わらない
- lockfile をディスクリプタ番号 9 で開く
- ディスクリプタ番号を指定して排他ロックする
- ロック失敗したら多重起動
- プロセスが死ねば lockfile のアドバイザリロックは勝手に解放される
上手く動いているように見えるけど・・・
続編