1. 程式人生 > >linux的crontab裡面,保證最多執行一個程序/兩個程序/多個程序的解決方法

linux的crontab裡面,保證最多執行一個程序/兩個程序/多個程序的解決方法

在linux的crontab裡面,保證最多執行一個程序/兩個程序/多個程序

這個多謝了老大的推薦。我解決了flock來解決crontab裡面,即使系統卡住,也最多執行兩個程序的問題。

flock 會去判斷根據一個鎖檔案去判斷程序有沒有在執行。如果在執行,後面的程序就得等待。

flock -s --shared: 
獲得一個共享鎖
flock -x --exclusive: 
獲得一個獨佔鎖/排他鎖
flock -u --unlock:
移除一個鎖,通常是不需要的,指令碼執行完會自動丟棄鎖。
flock -n --nonblock:    
如果沒有立即獲得鎖,直接失敗而不是等待
flock -w --timeout: 
如果沒有立即獲得鎖,等待指定時間。
flock -o --close:
在執行命令前關閉檔案的描述符號。用於如果命令產生子程序時會不受鎖的控制。
flock -c --command: 
在shell中執行一個單獨的命令

根據業務需要,如果下一次crontab來了要執行的時候,判斷檔案是否是獨佔鎖,如果鎖定的話直接失敗不等待。這樣當下任務判斷到/tmp/mytest.lock被鎖定,則結束當前的任務,下一個週期再判斷。引數為-xn.

因為這個是針對檔案進行加鎖的。檔案是自己建立的。所以我們可以指定兩個檔案來實現。舉個例子:

* * * * * sleep 30; flock -xn /home/onelock.lock -c 'cd /home/scrapy-web/v1/  && python run_spiders.py 1>>/data/log/collect/run_spiders.log 2>&1'

* * * * *  flock -xn /home/twolock.lock -c 'cd /home/scrapy-web/v1/  && python run_spiders.py 1>>/data/log/collect/run_spiders.log 2>&1'

這裡,我在/home的目錄下建立了兩個鎖檔案。一個是onelock.lock, 一個是twolock.lock.而且,第一個crontab,我在執行之後加了一個sleep 30;s,保證兩個指令碼不會同時執行。 這樣的話,在執行的時候,就能夠解決對一個指令碼加鎖,來保證crontab裡面,最多隻會有兩個程序。

參考:

https://www.jianshu.com/p/e1c55ffea1cb