時常有些機會寫了需要存取單一檔案且耗時許久的 shell script, 為了避免重複執行相同的 script 而覆蓋單一檔案,為了避免 race condition,必須查看是否已經執行了另外一隻程式,這些確認過程其實相當繁雜。

若寫過 C 語言,便知道有個函數是 flock (2),這個函式可以幫你在檔案上做 “advisory lock” (意思是,其他程式可以忽略你所下達的 lock 指令,而逕行複寫),但若你只是需要讓自己的程式知道檔案已被鎖住使用中,這倒是非常好用的函數。

Debian 系統中在新一點的 util-linux-ng加入flock (1) 指令,於是可以在 shell script 中如此鎖定特定檔案,如此便可避免單一程式重複執行、或複寫到同一個檔案。

#!/bin/shLOCKFILE=/tmp/script.lock
(
flock -n -x 200
if [ $? -ne 0 ] ;then
echo "The script is running already. bye"
exit
fi
date -R
read
) 200> ${LOCKFILE}

這是一篇 Tips.