Crontab 裡解決指令碼衝突的問題

2021-09-21 05:32:37 字數 1527 閱讀 6529

linux裡的crontab是乙個好東西,但是它的預設最小執行頻率是1分鐘,但是我們在實際生產環境裡有的時候遇到的指令碼執行時間是大於1分鐘的,這樣就會出現乙個很尷尬的情況,就是在1分鐘過後,系統程序會出現多個指令碼,neck and neck式的在後台執行,比如這樣:

從上面的圖可以看到,10點36分log499.sh沒有執行完畢,10點37又開始了執行了乙個新的log499.sh指令碼。這種指令碼衝突肯定不是我們所希望的,那麼如何才能保證後台只是在一段時間裡只執行乙個指令碼呢?

這個時候我們就要使用檔案鎖,flock,這種方法要比判斷pid高大上的多。

首先假設我們的指令碼名字叫abc.sh,這個指令碼檔案的執行時間是要大於1分鐘的,同時我們再設定乙個鎖檔案,位置就放在/tmp/abc.lock,這個檔案可以是空的,然後# crontab -e,新增一句命令如下:

1

* * * * * flock -xn/tmp/abc.lock -c'sh /路徑/abc.sh >> /記錄日誌的路徑 2>&1'

這個時候靜候crontab啟動abc.sh,通過# ps -ef|grep abc,發現在後台始終只有乙個abc程序。

但是有的時候會有這樣的乙個問題,就是abc執行一次之後,在下一次該執行的時候卻沒有執行,好像crontab失效了一樣,對於這樣的情況,就需要新增下面的語句到abc.sh末尾:

1

2

3

rm-rf/tmp/abc.lock#刪除掉原有的鎖檔案

sleepn#睡n秒

touch/tmp/abc.lock#再新建乙個鎖檔案

這樣不斷地更新lock鎖檔案,就會保證crontab每次都會按期執行。

這裡要注意一下,裡面我加了一句sleep n,這裡的n是為了跨分鐘的存在,這是為了防止沒有走到下乙個分鐘又會生成乙個新的lock鎖檔案,這樣還是會出現重複啟動指令碼的情況。

這裡就涉及到flock的乙個原理:在每一次執行任務的時候都會先去嘗試取到鎖檔案,如果取到了鎖檔案,那麼就會下一步,反之就會放棄執行。a任務在執行的時候已經佔據了lock檔案,那麼b任務來了,發現沒有lock了,就不會執行任務。

這裡我們使用了flock的三個引數:

-x, --exclusive: 獲得乙個獨佔鎖

-n, --nonblock:  如果沒有立即獲得鎖,直接失敗而不是等待

-c, --command:   在shell中執行乙個單獨的命令

參考資料:

git衝突的解決

使用git pull更新 時,你修改的檔案已被他人修改,而自己沒有更新時,git會提示commit your changes or stash them before you can merge.此時可以用git stash將你修改的檔案暫存入棧中,然後git pull 然後git stash po...

git衝突的解決

1.產生衝突原因 產生 多個開發者同時使用或者操作git中的同乙個檔案,最後在依次提交和 push 的時候,第乙個操作的是可以正常提交的,而之後的開發者想要執行 pull 拉 和 pull push 操作的時候,就會報衝突異常 conflict。解決 保留自己修改的資料,同時保留別人的資料資訊。2....

tortiseSVN衝突的解決

解決tortoisesvn衝突的具體思路如下 svn衝突的原因 你在本地的修改和版本庫中的版本修改的地方重疊了,也就是說,你修改了某一行,你 的同事也修改了同一行。這個就需要你自己手工去解決了。當衝突發生時,要注意如果你修改的檔案的內 容很多,你需要先備份一下你的本地檔案。tortisesvn衝突的...