Linux文件鎖-flock

背景:
在使用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文件的佔用學習



歡迎訂閱「K叔區塊鏈」 - 專一於區塊鏈技術學習

博客地址: http://www.jouypub.com
簡書主頁: https://www.jianshu.com/u/756c9c8ae984
segmentfault主頁: https://segmentfault.com/blog/jouypub
騰訊雲主頁: https://cloud.tencent.com/developer/column/72548
相關文章
相關標籤/搜索