伺服器上使用crontab部署這兩個每分鐘自動執行的命令。首先,這兩個命令是之前的人部署的,在我接手之前,就一直在了的。根據命令,實際上應該是做到每分鐘都執行一次指令碼。但是實際操作中,卻發現,其實並沒有嚴格的按照每分鐘一次執行,有時候是兩三分鐘才會執行一次。因為這個延遲並不是特別影響實際應用,所以我一直沒有很重視這個問題。
昨天因為需求,在伺服器上又部署了一套服務,定時任務加到了三條。因為服務是相似的,所以我沒有多想的直接複製了上一條定時任務的命令,只是修改了一下檔案路徑。然後晚上就發生了定時任務執行失敗的問題。也不是一直失敗,就是從每分鐘一次,變成了十幾分鐘一次。非常的影響效率。
對此我很疑惑,為什麼我只是加了乙個命令,定時任務的執行時間就不對了。我開始上網找原因,我看過了大家各種各樣的crontab踩坑記錄,但是沒有一條是符合我的情況的。知道我發現了這篇 。雖然對方記錄了四種常見的,能解決大部分情況的踩坑記錄,但是和我的情況還是不符。那麼我為什麼會專門提起這篇呢,因為我發現,雖然對方記錄的解決方法並不能幫助到我,但是文章中提到的第四種情況,加檔案鎖的方法,給了我啟發。
使用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命令,還需要記住一點,就是不能放過任何乙個小細節。
CRONTAB 任務執行失敗
問題背景 每天資料庫自動備份並自動發出郵件。手動執行指令碼沒有任何問題,但放在crontab 則無法執行。排查過程 查詢日誌,發現系統日誌裡面沒有crontab的日誌。1.開啟日誌,我這裡為ubuntu系統 vi etc rsyslog.d 50 default.conf cron.var log ...
crontab 執行失敗原因
1.cron 服務沒有啟動 使用 etc init.d crond status 如沒有啟動,啟動該服務 etc init.d crond start 2.crontab 指令碼中使用了相對路徑引用可執行檔案,導致找不到可執行檔案 3.crontab 使用者對crontab 指令碼中呼叫的可執行程式...
crontab任務未執行
最近在ubuntu系統中使用crontab定時任務遇到了問題,現記錄下來,希望能夠幫助到遇到同樣問題的同學。問題描述 使用crontab做mysql資料庫的定時備份,發現到點确沒有正常執行任務完成備份操作。解決思路 1.使用 service cron status 檢視crontab任務是否正常啟動...