linux使用——flock文件鎖解決crontab腳本重復執行問題


背景

  • 在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'
      • 執行腳本地址及打印日志
      • 注意:一定要加上引號,否則腳本不執行!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM