crontab 定時任務避免重複執行
阿新 • • 發佈:2019-01-08
使用crontab設定一個指令碼每個一段時間自動執行一次,當指令碼的執行時間超過crontab設定的時間間隔,那個指令碼就會在同一時刻同時執行。比如設定crontab每隔五分鐘執行一次task.sh:
*/5 * * * * /bin/bash /pathto/task.sh
如果task.sh執行超過了5分鐘,那麼五分鐘之後就會有兩個task.sh在執行。不符預期。
拿下面執行10秒的指令碼task.sh為例:
#! /bin/bash
echo haha
sleep 10
echo hhheee
如何防止10秒之內再次執行該指令碼呢?
方法一,在指令碼中模擬加鎖
#! /bin/bash
# check lock exist
if [[ -f test.lock ]]
then
echo this file is already exists
exit 1
else
touch test.lock
fi
echo haha
sleep 10
echo hhheee
# remove the lock
rm -f test.lock
10秒只能該指令碼不會重複執行。
方法二, 使用flock命令
在一個終端中執行:
flock -xn test.lock -c 'sh task.sh'
10s內,在第二個終端中,執行上面命令,發現執行失敗。10s過後,再次執行,成功。
所以,在crontab中使用flock命令執行指令碼可以防止迴圈執行週期內重複執行指令碼。