linux-flock文件鎖之實際運用


vi test.sh

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

touch test.lock #隨便命名

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

 

運行中...

開啟另外一個bash窗口運行

[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中執行其后的語句

 


免責聲明!

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



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