crontab自動執行任務,失敗原因記錄


        服務器上使用crontab部署這兩個每分鍾自動執行的命令。首先,這兩個命令是之前的人部署的,在我接手之前,就一直在了的。根據命令,實際上應該是做到每分鍾都執行一次腳本。但是實際操作中,卻發現,其實並沒有嚴格的按照每分鍾一次執行,有時候是兩三分鍾才會執行一次。因為這個延遲並不是特別影響實際應用,所以我一直沒有很重視這個問題。

        昨天因為需求,在服務器上又部署了一套服務,定時任務加到了三條。因為服務是相似的,所以我沒有多想的直接復制了上一條定時任務的命令,只是修改了一下文件路徑。然后晚上就發生了定時任務執行失敗的問題。也不是一直失敗,就是從每分鍾一次,變成了十幾分鍾一次。非常的影響效率。

        對此我很疑惑,為什么我只是加了一個命令,定時任務的執行時間就不對了。我開始上網找原因,我看過了大家各種各樣的crontab踩坑記錄,但是沒有一條是符合我的情況的。知道我發現了這篇 https://blog.csdn.net/qivan/article/details/53836426 。雖然對方記錄了四種常見的,能解決大部分情況的踩坑記錄,但是和我的情況還是不符。那么我為什么會專門提起這篇呢,因為我發現,雖然對方記錄的解決方法並不能幫助到我,但是文章中提到的第四種情況,加文件鎖的方法,給了我啟發。

       使用linux flock 文件鎖,可以避免任務的重復執行,所以一般情況是,針對執行頻率快的命令,推薦加上鎖。通過對文件鎖命令的了解,我發現了我問題所在。

flock命令詳解如下:

-s, --shared: 獲得一個共享鎖
-x, --exclusive: 獲得一個獨占鎖
-u, --unlock: 移除一個鎖,通常是不需要的,腳本執行完會自動丟棄鎖
-n, --nonblock: 如果沒有立即獲得鎖,直接失敗而不是等待
-w, --timeout: 如果沒有立即獲得鎖,等待指定時間
-o, --close: 在運行命令前關閉文件的描述符號。用於如果命令產生子進程時會不受鎖的管控
-c, --command: 在shell中運行一個單獨的命令
-h, --help 顯示幫助
-V, --version: 顯示版本

        查看一下我的文件鎖命令  flock -xn /tmp/yuxiu.lock -c      我用上了xn這兩個命令,但看這個命令,其實是個很平常的命令,沒有任何問題。但是我三個定時任務,用的都是這個命令。三個命令使用同一個獨占鎖,且沒有立即獲得鎖,任務即算失敗。所以一分鍾之內,三個命令只會有一個命令是成功執行的,剩下兩個就會失敗。之前只有兩個命令同時搶一個獨占鎖,所以有時候會有三四分鍾的延遲。現在是三個命令搶一個鎖。。這個等待時間就延長了。

        所以解決辦法也很簡單,把其中兩個任務的鎖名改一下就好,每個命令有一個單獨的文件鎖。或者修改一下命令,把鎖屬性從獨占鎖變為共享鎖。都可以解決這個問題。

        通過這件事,不止學習了解到了flock命令,還需要記住一點,就是不能放過任何一個小細節。


免責聲明!

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



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