您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關shell中怎么實現文件鎖功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
關于flock
flock 是對于整個文件的建議性鎖。也就是說,如果一個進程在一個文件(inode)上放了鎖,那么其它進程是可以知道的。(建議性鎖不強求進程遵守。)最棒的一點是,它的第一個參數是文件描述符,在此文件描述符關閉時,鎖會自動釋放。而當進程終止時,所有的文件描述符均會被關閉。
3. shell中實現flock系統調用的命令是flock,其使用格式有以下兩種(man flock)
代碼如下:
flock [-sxon] [-w timeout] lockfile [-c] command...
flock [-sxun] [-w timeout] fd
選項和參數:
-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中執行其后的語句
4. shell中實現排它鎖避免腳本重復執行
Linux中的例行性工作排程crontab會定時執行一些腳本,但腳本的執行時間往往無法控制,當腳本執行時間過長時,可能會導致上一次任務的腳本還沒執行完,下一次任務的腳本又開始執行了。這種情況下可能會出現一些并發問題,嚴重時會導致出現臟數據/性能瓶頸的惡性循環。
通過使用flock建立排它鎖可以規避這個問題,如果一個進程對某個加了排他鎖,則其它進程無法加鎖,可以選擇等待超時或馬上返回。測試實例如下:
4.1 創建執行腳本
代碼如下:
#cat /scripts/shell/file_lock.sh
#!/bin/bash
# Description: test for file flock
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo ""
echo "----------------------------------"
echo "start at `date '+%Y-%m-%d %H:%M:%S'` ..."
sleep 140s
echo "finished at `date '+%Y-%m-%d %H:%M:%S'` ..."
4.2 創建定時任務:測試排它鎖
代碼如下:
#crontab -e
* * * * * flock -xn /dev/shm/test.lock -c "sh /scripts/shell/file_lock.sh > /root/stdout.log"
每分鐘執行一次該腳本,并將輸出信息寫入到stdout.log
查看輸出日志如下:
代碼如下:
----------------------------------
start at 2014-04-10 10:23:01 ... #獲取鎖
finish at 2014-04-10 10:25:21 ... #釋放鎖
----------------------------------
start at 2014-04-10 10:26:01 ... #10:27:00及10:28:00啟動的定時任務由于無法獲取鎖,以失敗而退出執行,直到10:26:00才獲取到鎖
finish at 2014-04-10 10:28:21 ...
4.3 測試排它鎖,加上等待超時
代碼如下:
* * * * * flock -x -w 20 /dev/shm/test.lock -c "sh /scripts/shell/file_lock.sh > /root/stdout.log"
查看日志輸出信息:
代碼如下:
----------------------------------
start at 2014-04-10 10:29:01 ...
finish at 2014-04-10 10:31:21 ...
----------------------------------
start at 2014-04-10 10:31:21 ... #10:31:00啟動的定時任務等待了20秒后,上一個任務釋放了鎖,所以此任務可以馬上拿到鎖,并繼續執行
finish at 2014-04-10 10:33:41 ...
看完上述內容,你們對shell中怎么實現文件鎖功能有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。