天天看點

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

    排它鎖的有效性。

作者:授客

QQ:1033553122

全國軟體測試QQ交流群:7156436

Git位址:https://gitee.com/ishouke

友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!

作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額随意,您的支援将是我繼續創作的源動力,打賞後如有任何疑問,請聯系我!!!

           微信打賞                       

支付寶打賞                  全國軟體測試交流QQ群  

Linux 基于flock指令實作多程式并發讀寫檔案控制
Linux 基于flock指令實作多程式并發讀寫檔案控制
Linux 基于flock指令實作多程式并發讀寫檔案控制

繼續閱讀