Linux防止重復執行定時任務


linux下啟動一個定時任務,間隔執行某個腳本,但是這個腳本可能會持續較長時間,時間不定。

另外,這個腳本可以可能通過后台管理界面手動觸發。

問題來了,怎么防止兒任務重復執行?就是說當新的任務到來的時候,需要把老的停止掉。

如何實現?

 

 

用flock命令解決Linux計划任務重復執行

 

在做計划任務的時候,可能由於某些問題,任務沒有執行完成,導致任務重復的運行,解決這個問題,只需要一個flock命令就可以了。

flock --help
flock (util-linux-ng 2.17.2)
Usage: flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command...
flock [-sxon][-w #] directory [-c] command...
-s --shared Get a shared lock #獲得一個共享鎖
-x --exclusive Get an exclusive lock #獲得一個獨占鎖,這是默認的
-u --unlock Remove a lock #刪除一個鎖,通常是不需要的,因為在文件關閉時鎖會自動刪除
-n --nonblock Fail rather than wait #如果沒有立即獲得鎖,直接失敗而不是等待
-w --timeout Wait for a limited amount of time #如果沒有立即獲得鎖,等待指定時間
-o --close Close file descriptor before running command #在執行命令之前關閉保持鎖的文件描述符
-c --command Run a single command string through the shell #在shell中運行一個單獨的命令
-h --help Display this text #顯示幫助
-V --version Display version #顯示版本

例:

我要用rsync計划任務做同步,寫了一個日志切割腳本logsplit.sh,設置了30分鍾同步一次服務端,但是可能由於其他某些因素導致,30分鍾內沒有同步完成,后台還會繼續執行此計划任務,此時就能看到兩個rsync同步同時在跑,這時候我們就需要flock命令來解決問題了。

原來我的計划任務:

*/30 * * * * /www/logspli.sh

使用flock后的計划任務:

*/30 * * * * flock -xn /tmp/demo.lock -c /www/logspli.sh

這樣的話,當前計划任務whsir.sh如果沒有運行完,下一個任務會判斷demo.lock被鎖定,直接失敗,等待下次在判斷。

 

flock命令

flock是Linux下的文件鎖。

當多個進程可能會對同樣的數據執行操作時,這些進程需要保證其它進程沒有也在操作,以免損壞數據。

通常,這樣的進程會使用一個「鎖文件」,也就是建立一個文件來告訴別的進程自己在運行,如果檢測到那個文件存在則認為有操作同樣數據的進程在工作。這樣的問題是,進程不小心意外死亡了,沒有清理掉那個鎖文件,那么只能由用戶手動來清理了。

參數

-s,--shared:獲取一個共享鎖,在定向為某文件的FD上設置共享鎖而未釋放鎖的時間內,其他進程試圖在定向為此文件的FD上設置獨占鎖的請求失敗,而其他進程試圖在定向為此文件的FD上設置共享鎖的請求會成功。
-x,-e,--exclusive:獲取一個排它鎖,或者稱為寫入鎖,為默認項。
-u,--unlock:手動釋放鎖,一般情況不必須,當FD關閉時,系統會自動解鎖,此參數用於腳本命令一部分需要異步執行,一部分可以同步執行的情況。
-n,--nb, --nonblock:非阻塞模式,當獲取鎖失敗時,返回1而不是等待。
-w, --wait, --timeout seconds:設置阻塞超時,當超過設置的秒數時,退出阻塞模式,返回1,並繼續執行后面的語句。
-o, --close:表示當執行command前關閉設置鎖的FD,以使command的子進程不保持鎖。
-c, --command command:在shell中執行其后的語句。

實例

crontab運用flock防止重復執行

0 23 * * * (flock -xn ./test.lock -c "sh /root/test.sh") #-n 為非阻塞模式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM