Linux-flock文件鎖的使用

在多個進程同時操做同一份文件的過程當中,很容易致使文件中的數據混亂,須要鎖操做來保證數據的完整性,這裏介紹的針對文件的鎖,稱之爲「文件鎖」-flock。nginx


flock,建議性鎖,不具有強制性。一個進程使用flock將文件鎖住,另外一個進程能夠直接操做正在被鎖的文件,修改文件中的數據,緣由在於flock只是用於檢測文件是否被加鎖,針對文件已經被加鎖,另外一個進程寫入數據的狀況,內核不會阻止這個進程的寫入操做,也就是建議性鎖的內核處理策略。

flock主要三種操做類型:
LOCK_SH,共享鎖,多個進程可使用同一把鎖,常被用做讀共享鎖;
LOCK_EX,排他鎖,同時只容許一個進程使用,常被用做寫鎖;
LOCK_UN,釋放鎖;

進程使用flock嘗試鎖文件時,若是文件已經被其餘進程鎖住,進程會被阻塞直到鎖被釋放掉,或者在調用flock的時候,採用LOCK_NB參數,在嘗試鎖住該文件的時候,發現已經被其餘服務鎖住,會返回錯誤,errno錯誤碼爲EWOULDBLOCK。即提供兩種工做模式:阻塞與非阻塞類型。shell

flock只能對整個文件加鎖,不能對文件的一部分進行加鎖。bash

 

運用示例以下:異步

vi test.shspa

#! /bin/bash
echo "Hello World"
sleep 10

touch test.lock #隨便命名code

[root@localhost ~]# flock -xn ./test.lock -c "sh /root/test.sh"blog

 

運行中...進程

開啓另一個bash窗口運行crontab

[root@localhost ~]# flock -xn ./test.lock -c "sh /root/test.sh"同步

 

 前面未獲取到鎖直接返回 直到其餘運行完畢 這個纔開始運行

 

計劃任務中運用

1 crontab運用flock防止重複執行

* * * * * (flock -xn ./test.lock -c "sh /root/test.sh") #-n 爲非阻塞模式

2 機器down機自動啓動或重啓

能夠在daemon開始的時候, 打開一個文件而後獲取一個寫鎖. 守護腳本也打開文件並設置寫鎖, 而後阻塞, 一旦寫鎖得到成功, 則說明daemon已經掛了. 此時守護腳本重啓daemon並放棄寫鎖.

運行

flock -x ./test.lock -c "/usr/local/nginx/sbin/nginx" #去掉-n表示使用阻塞模式

運行中...

再次執行

flock -x ./test.lock -c "/usr/local/nginx/sbin/nginx" #去掉-n表示使用阻塞模式

阻塞中...

 

模擬down機 

[root@localhost ~]# ps aux |grep "nginx"|grep"master"|grep -v "grep"|awk'{print $2}'|xargskill -9

 

kill後阻塞的命令立刻執行 新的進程PID立馬產生,實現效果

 

附加flock參數

-s,--shared:獲取一個共享鎖,在定向爲某文件的FD上設置共享鎖而未釋放鎖的時間內,其餘進程試圖在定向爲此文件的FD上設置獨佔鎖的請求失敗,而其餘進程試圖在定向爲此文件的FD上設置共享鎖的請求會成功。
-x,-e,--exclusive:獲取一個排它鎖,或者稱爲寫入鎖,爲默認項
-u,--unlock:手動釋放鎖,通常狀況沒必要須,當FD關閉時,系統會自動解鎖,此參數用於腳本命令一部分須要異步執行,一部分能夠同步執行的狀況。
-n,--nb, --nonblock:非阻塞模式,當獲取鎖失敗時,返回1而不是等待-w, --wait, --timeout seconds:設置阻塞超時,當超過設置的秒數時,退出阻塞模式,返回1,並繼續執行後面的語句-o, --close:表示當執行command前關閉設置鎖的FD,以使command的子進程不保持鎖。-c, --command command:在shell中執行其後的語句

相關文章
相關標籤/搜索