linux的crontab裡面,保證最多執行一個程序/兩個程序/多個程序的解決方法
阿新 • • 發佈:2018-12-25
在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裡面,最多隻會有兩個程序。