背景:
在使用crontab管理定時腳本時,若是設定的腳本執行時間間隔較短,例如5分鐘執行一次,正常狀況下,腳本執行耗時1分鐘,在非正常狀況下(如服務器壓力較大的狀況下,或數據量忽然增大),腳本執行時間超過5分鐘,這時就會形成多個腳本同時執行,嚴重時甚至拖垮服務器,影響服務器上的其它服務mysql
舉個例子,每10分鐘更新mysql數據的腳本sql
5/* * * * * sh /services/scripts/update_mysql_data.sh
一般狀況下,腳本執行只須要30s,可是某天忽然有人修改數據結構,形成鎖表,腳本一直等待執行。超過5分鐘的間隔夠,腳本又會執行一次,最後等發現問題時,已是業務方收到影響了shell
這時就須要Linux的文件鎖-flock!segmentfault
flock簡介:
當多個進程可能會執行同一個腳本,這些進程須要保證其它進程沒有在操做,以避免重複執行。一般,這樣的進程會使用一個「鎖文件」,也就是創建一個文件來告訴別的進程本身在運行,若是檢測到那個文件存在則認爲有操做一樣數據的進程在工做。bash
使用方法:服務器
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: 顯示版本
瞭解flock了,咱們就能夠對上面的腳本進行改進數據結構
5/* * * * * flock -xn /services/scripts/update_mysql_data.lock -c 'sh /services/scripts/update_mysql_data.sh'
當/services/scripts/update_mysql_data.lock
被進程佔用時,別的進程就不會再重複執行文件。還有一個好處是,不須要手動釋放鎖,禁止執行完以後會自動釋放對lock文件的佔用學習