背景
- 在Linux系統使用crontab配置一個定時任務后,出現一種情況,如果我設置的crontab任務時間是每隔1分鍾執行一次任務腳本,但是這個腳本執行時間超過了1分鍾,比如2分鍾,這時系統會再執行任務。導致兩個相同的任務在執行。這種情況下可能會出現一些並發問題,嚴重時會導致出現臟數據/性能瓶頸的惡性循環。
處理
- 思想
- 利用Linux中的flock,將執行腳本的定時任務進程加上文件鎖。
- flock詳解
- 簡介:
- flock是對於整個文件的建議性鎖。如果一個進程在一個文件(inode)上放了鎖,那么其它進程是可以知道的。(建議性鎖不強求進程遵守。)最棒的一點是,它的第一個參數是文件描述符,在此文件描述符關閉時,鎖會自動釋放。而當進程終止時,所有的文件描述符均會被關閉。
- 當多個進程可能會執行同一個腳本,這些進程需要保證其它進程沒有在操作,以免重復執行。通常,這樣的進程會使用一個「鎖文件」,也就是建立一個文件來告訴別的進程自己在運行,如果檢測到那個文件存在則認為有操作同樣數據的進程在工作。
- 使用
- 簡介:
flock -h Usage: flock [options] <file|directory> <command> [command args] flock [options] <file|directory> -c <command> flock [options] <file descriptor number> Options: -s, --shared: 獲得一個共享鎖 -x, --exclusive: 獲得一個獨占鎖 -u, --unlock: 移除一個鎖,通常是不需要的,腳本執行完會自動丟棄鎖 -n, --nonblock: 如果沒有立即獲得鎖,直接失敗而不是等待 -w, --timeout: 如果沒有立即獲得鎖,等待指定時間 -o, --close: 在運行命令前關閉文件的描述符號。用於如果命令產生子進程時會不受鎖的管控 -c, --command: 在shell中運行一個單獨的命令 -h, --help 顯示幫助 -V, --version: 顯示版本
實例
- 我的腳本如下
*/1 * * * * flock -xn /home/jingguoliang/project/sh/ordersleep.lock -c '/bin/sh /home/jingguoliang/project/sh/orderbiz.sh >/dev/null 2>&1' */1 * * * * flock -xn /home/jingguoliang/project/sh/paysleep.lock -c '/bin/sh /home/jingguoliang/project/sh/paybiz.sh >/dev/null 2>&1'
- 腳本解釋
- flock -xn /home/jingguoliang/project/sh/paysleep.lock -c
- 對后面的腳本進程加文件鎖,格式為:flock 參數 鎖文件地址 參數
- '/bin/sh /home/jingguoliang/project/sh/paybiz.sh >/dev/null 2>&1'
- 執行腳本地址及打印日志
- 注意:一定要加上引號,否則腳本不執行!!!
- flock -xn /home/jingguoliang/project/sh/paysleep.lock -c