Linux 基於flock命令實現多進程並發讀寫文件控制


基於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

實踐結果表明:

  1. 鎖文件(例中為LOCK-FILE)如果不存在,會自動創建;
  2. 基於flock在第2個終端上執行的shell命令,在第一個終端上執行的shell命令執行完成后才開始運行,驗證了flock排它鎖的有效性。


免責聲明!

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



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