基于flock命令實作多行程并發讀寫檔案控制
需求描述
實際專案中,需要在Linux下通過shell腳本并發讀寫同一個檔案,但是希望同一時刻,只有一個行程可以在讀、寫目標檔案,
解決方案
使用flock命令,
flock命令介紹
語法
# flock --help
用法:
flock [options] <file|directory> <command> [command args]
flock [options] <file|directory> -c <command>
flock [options] <file descriptor number>
常用選項:
-s --shared 獲取一個共享鎖
-x --exclusive 獲取一個排他鎖(默認情況)
-u --unlock 移除一個鎖
-n --nonblock 非阻塞模式,當獲取鎖失敗時,回傳1而非等待,
-w --timeout <secs> 阻塞模式,當獲取鎖失失敗時,等待secs秒,超時后退出,默認情況下,會一直等待直到獲取鎖
-E --conflict-exit-code <number> 沖突或者超時導致程式退出時的退出狀態碼
-o --close 運行命令前,關閉檔案描述符,會自動釋放鎖,
-c --command <command> 通過shell運行command,命令運行完成,也會自動釋放鎖(如果已上鎖的話)
原理
flock命令通過給某個檔案、目錄上鎖來告訴其它行程自己的狀態,也就是說基于檔案鎖實作程式控制,
支持的檔案鎖有兩種:
-
共享鎖(
shared lock)當檔案被上了共享鎖之后,其他行程可以繼續為此檔案加共享鎖,但不能添加排他鎖,被上鎖的檔案會有一個共享鎖計數,每添加一個共享鎖,計數 +1,每解鎖一個共享鎖,計數 -1,只有當共享鎖計數為0時,才可以為其添加排他鎖,
-
排他鎖(
exclusive lock)當檔案被上了排他鎖之后,在解鎖之前,其它行程不能為該檔案添加共享鎖和排他鎖
具體實踐
新建test_file_lock.sh檔案,內容如下
#!/bin/bash
echo "----------------------------------"
echo "start at `date '+%Y-%m-%d %H:%M:%S'`"
sleep 30s
echo "finished at `date '+%Y-%m-%d %H:%M:%S'`"
打開3個Linux終端,分別在其中兩個終端的相同路徑下,執行以下命令
# flock -x LOCK-FILE -c "sh test_file_lock.sh >out.log"
執行上述命令以后,馬上在第三個終端的相同路徑下,執行tail -f out.log查看輸出,結果如下
#tail -f out.log
----------------------------------
start at 2021-12-29 09:17:21
finished at 2021-12-29 09:17:51
tail: out.log: file truncated
----------------------------------
start at 2021-12-29 09:17:51
finished at 2021-12-29 09:18:21
實踐結果表明:
- 鎖檔案(例中為
LOCK-FILE)如果不存在,會自動創建; - 基于
flock在第2個終端上執行的shell命令,在第一個終端上執行的shell命令執行完成后才開始運行,驗證了flock排它鎖的有效性,
作者:授客
QQ:1033553122
全國軟體測驗QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞后如有任何疑問,請聯系我!!!
微信打賞
支付寶打賞 全國軟體測驗交流QQ群
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/401375.html
標籤:其他
下一篇:Xamarin使用API插入資料
