溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何解決crontab在一秒內(nèi)刷新多次導(dǎo)致部分腳本不生效的問(wèn)題

發(fā)布時(shí)間:2021-11-08 11:41:57 來(lái)源:億速云 閱讀:382 作者:小新 欄目:云計(jì)算

小編給大家分享一下如何解決crontab在一秒內(nèi)刷新多次導(dǎo)致部分腳本不生效的問(wèn)題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

ob在幾臺(tái)DB上發(fā)現(xiàn)crontab中的監(jiān)控任務(wù),從來(lái)沒(méi)有執(zhí)行。但操作一下crontab的配置crontab –e + wq,監(jiān)控任務(wù)就能正常執(zhí)行,重啟cron也能正常執(zhí)行。

出問(wèn)題的機(jī)器crontab的情況如下:

問(wèn)題挺奇怪,第一條crontab執(zhí)行正常,第二條crontab一直沒(méi)有執(zhí)行。

第一條正常,證明cron有正常運(yùn)行。DB監(jiān)控任務(wù)的crontab是凱麗系統(tǒng)自動(dòng)安裝的,理論上不會(huì)存在突然出錯(cuò)的情況。

問(wèn)題定位:

cron出bug了? 第二個(gè)任務(wù)確實(shí)沒(méi)有執(zhí)行,還是執(zhí)行前遇到問(wèn)題退出,剛好日志又打印到/dev/null了..

考慮到crontab執(zhí)行歷史在系統(tǒng)日志里會(huì)有記錄,檢查var/log/message日志如下,整*/5的分鐘點(diǎn)只有crontab的第一個(gè)任務(wù)。

crontab第二個(gè)任務(wù)確實(shí)沒(méi)執(zhí)行,應(yīng)該是crontab出了點(diǎn)問(wèn)題,再看看在修改crontab的那一刻發(fā)生了什么?

根據(jù)crontab最后一次修改的時(shí)間(2012-06-18 17:51:01),檢查系統(tǒng)日志如下:

剛巧,在同一秒內(nèi)修改了2次crontab。根據(jù)凱麗安裝監(jiān)控的順序,第一個(gè)crontab應(yīng)該是在安裝第一條crontab任務(wù),第二個(gè)crontab應(yīng)該是在安裝第二個(gè)crontab任務(wù)。

猜想:根據(jù)cron的工作原理,難道在增加第一個(gè)任務(wù)之后,cron加載了crontab的配置(/var/spool/cron/tabs/mysql),但是在增加第二個(gè)任務(wù)之后,cron沒(méi)有加載該配置? 如果是這樣,那么cron判斷是否需要加載配置文件的機(jī)制是如何的呢?

網(wǎng)上文檔稀少,直接看代碼。

在網(wǎng)上找到一個(gè)debian的cron源代碼: cron_3.0pl1.orig.tar.gz

解壓打開,查看cron的執(zhí)行過(guò)程:
在cron.c 的main函數(shù)中,cron的主函數(shù)代碼如下:

cron_sleep(): crontab 最小執(zhí)行單位是分鐘,因此是每60秒執(zhí)行一次.TargetTime += 60;

load_database(): 檢查crontab的配置文件是否有更新,如果有更新,則重新load,否則使用上次記錄的database cron_tick( ): 實(shí)際執(zhí)行任務(wù)查看cron是如何加載crontab的配置文件的,進(jìn)入load_database()函數(shù).
database.c :

可以看到,在cron加載配置的時(shí)候,會(huì)先獲取/var/spool/cron/tabs 目錄stat信息,然后獲取用戶的crontab配置文件的stat信息,然后比較上一次統(tǒng)計(jì)的修改時(shí)間與tabs目錄、crontab配置文件的最后修改時(shí)間,如果一致則不重新load,否則重新load crontab配置文件。

stat為系統(tǒng)函數(shù)調(diào)用,該函數(shù)取得的結(jié)構(gòu)體的st_mtime的單位為秒。

至此,我們可以得出這樣的結(jié)論:

由于兩次crontab修改時(shí)間均在同一秒,而cron的加載是以crontab配置文件的最后修改時(shí)間(秒級(jí))來(lái)判斷文件是否需要更新。當(dāng)出現(xiàn)以下場(chǎng)景,第二次對(duì)crontab的修改就會(huì)失效(不僅是增加)。

crontab失效的場(chǎng)景:

而這個(gè)場(chǎng)景,剛好是我們的DB出現(xiàn)crontab失效的情況。

crontab的刷新機(jī)制,是以crontab文件的最后修改時(shí)間為準(zhǔn).

因此,如果在一秒內(nèi)對(duì)crontab進(jìn)行多次(大于1次)操作,就可能出現(xiàn)后修改的crontab不執(zhí)行!

當(dāng)再次對(duì)crontab文件進(jìn)行保存操作時(shí),cron會(huì)重新加載配置文件,crontab生效.

解決辦法:

該問(wèn)題是由于在一秒內(nèi)執(zhí)行多次crontab變更導(dǎo)致。因此解決辦法有3個(gè):

  1. 在凱麗每次操作crontab的時(shí)候增加sleep 1的操作

  2. 在凱麗每次crontab操作完成之后,sleep 1,強(qiáng)制刷新crontab的最后更新時(shí)間

  3. 合并并行的crontab操作為一次操作,減少對(duì)crontab的操作頻率

根據(jù)凱麗的情況,選擇第二個(gè)方案對(duì)現(xiàn)有代碼改動(dòng)最小。

提醒:

腳本盡量不要在同一秒內(nèi)多次操作crontab內(nèi)容,否則可能導(dǎo)致crontab不生效的情況。

以上是“如何解決crontab在一秒內(nèi)刷新多次導(dǎo)致部分腳本不生效的問(wèn)題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI