Linux flock文件級(jí)別的鎖定方式
flock
是 Linux/Unix 系統(tǒng)中的一個(gè)命令,用于實(shí)現(xiàn)文件級(jí)別的鎖定。它允許你在多個(gè)進(jìn)程之間共享對(duì)文件的訪問(wèn),但確保在同一時(shí)間只有一個(gè)進(jìn)程可以訪問(wèn)文件,避免競(jìng)態(tài)條件(race conditions)和數(shù)據(jù)不一致問(wèn)題。
flock的基本概念
flock
(file lock)是文件鎖的實(shí)現(xiàn),它使用文件描述符來(lái)鎖定文件。通過(guò) flock
,你可以在同一時(shí)間內(nèi)對(duì)一個(gè)文件加鎖,使得只有一個(gè)進(jìn)程能訪問(wèn)該文件。其他進(jìn)程嘗試訪問(wèn)時(shí)會(huì)等待或者直接失敗,具體行為取決于鎖的模式。
flock
既支持 共享鎖(多個(gè)進(jìn)程可以讀取文件)也支持 排它鎖(只有一個(gè)進(jìn)程可以寫(xiě)入文件)。
flock的使用場(chǎng)景
- 防止多個(gè)進(jìn)程同時(shí)執(zhí)行同一任務(wù):常用于任務(wù)調(diào)度中,確保某個(gè)任務(wù)在同一時(shí)間內(nèi)只有一個(gè)實(shí)例在運(yùn)行。
- 同步進(jìn)程訪問(wèn)共享資源:當(dāng)多個(gè)進(jìn)程訪問(wèn)共享文件或資源時(shí),使用
flock
可以避免同時(shí)修改文件而引發(fā)的競(jìng)態(tài)條件。 - 鎖定配置文件或日志文件:確保同一時(shí)間只有一個(gè)進(jìn)程可以修改或?qū)懭肴罩疚募?、配置文件等?/li>
flock的命令格式
flock [options] <file> <command>
<file>
:要鎖定的文件。它是一個(gè)普通文件,可以是一個(gè)空文件,也可以是一個(gè)日志文件或其他進(jìn)程共享的文件。<command>
:要執(zhí)行的命令。如果命令執(zhí)行成功,flock
會(huì)自動(dòng)釋放文件鎖。
flock的常用選項(xiàng)
-n
或--nonblock
:非阻塞模式。如果文件已經(jīng)被鎖定,flock
不會(huì)等待鎖的釋放,而是立即退出并返回錯(cuò)誤。-x
或--exclusive
:排他鎖。只有一個(gè)進(jìn)程可以獲得文件鎖,其他進(jìn)程必須等待直到鎖被釋放。-s
或--shared
:共享鎖。多個(gè)進(jìn)程可以獲得共享鎖,通常用于讀取文件,不會(huì)阻止其他進(jìn)程對(duì)文件進(jìn)行共享讀取。-w <timeout>
或--wait <timeout>
:等待指定的時(shí)間(單位:秒),如果超時(shí)則退出。這個(gè)選項(xiàng)適用于阻塞模式,在獲取鎖時(shí)設(shè)置最大等待時(shí)間。-u
或--unlock
:顯式釋放鎖。
flock的工作模式
flock
可以以兩種方式工作:
- 阻塞模式(默認(rèn)):如果文件已經(jīng)被鎖定,
flock
會(huì)等待鎖釋放,然后執(zhí)行命令。 - 非阻塞模式:如果文件已經(jīng)被鎖定,
flock
會(huì)立即退出,不會(huì)等待鎖釋放。
flock示例
示例 1:在crontab中確保同一時(shí)間只有一個(gè)進(jìn)程運(yùn)行
假設(shè)你有一個(gè) Python 腳本,且你希望確保這個(gè)腳本每分鐘執(zhí)行一次,但如果上一個(gè)實(shí)例正在運(yùn)行,則跳過(guò)當(dāng)前的執(zhí)行。
你可以在 crontab
中結(jié)合 flock
來(lái)實(shí)現(xiàn)這一目標(biāo):
* * * * * /usr/bin/flock -n /tmp/my_task.lockfile /usr/bin/python3 /path/to/your/script.py
解釋?zhuān)?/p>
/usr/bin/flock -n /tmp/my_task.lockfile
:嘗試獲取/tmp/my_task.lockfile
文件的鎖。如果該文件已經(jīng)被鎖定(即其他進(jìn)程正在運(yùn)行),則不等待直接退出。/usr/bin/python3 /path/to/your/script.py
:要執(zhí)行的 Python 腳本。
這種方式確保了每分鐘執(zhí)行一次腳本,但如果上一個(gè)腳本實(shí)例還在運(yùn)行,新任務(wù)會(huì)因無(wú)法獲得鎖而跳過(guò)。
示例 2:用flock來(lái)控制任務(wù)
假設(shè)你有一個(gè)任務(wù)需要寫(xiě)入日志文件,并且你希望確保在同一時(shí)間只有一個(gè)進(jìn)程能訪問(wèn)這個(gè)文件進(jìn)行寫(xiě)入。你可以使用 flock
來(lái)鎖定該文件。
flock /tmp/my_task.lockfile echo "任務(wù)開(kāi)始執(zhí)行 $(date)" >> /path/to/logfile.log
解釋?zhuān)?/p>
flock /tmp/my_task.lockfile
:對(duì)/tmp/my_task.lockfile
文件加鎖。echo "任務(wù)開(kāi)始執(zhí)行 $(date)" >> /path/to/logfile.log
:將任務(wù)執(zhí)行的日志寫(xiě)入/path/to/logfile.log
文件。
如果有多個(gè)進(jìn)程嘗試執(zhí)行這個(gè)命令,它們會(huì)先后獲取鎖,確保不會(huì)同時(shí)寫(xiě)入日志文件。
示例 3:在 Bash 腳本中使用flock
你可以將 flock
集成到你的 Bash 腳本中,確保某些操作只在一個(gè)進(jìn)程中運(yùn)行:
#!/bin/bash # 獲取文件鎖 ( flock -n 200 || exit 1 # 如果文件已經(jīng)被鎖定,退出腳本 echo "任務(wù)正在執(zhí)行..." # 任務(wù)執(zhí)行的邏輯 sleep 60 # 模擬任務(wù)的執(zhí)行過(guò)程 ) 200>/tmp/my_task.lockfile
解釋?zhuān)?/p>
flock -n 200
:對(duì)文件描述符 200 加鎖。文件描述符 200 綁定到/tmp/my_task.lockfile
文件。|| exit 1
:如果文件已被鎖定,退出腳本。- 文件鎖是基于文件描述符的,因此你需要將文件描述符與一個(gè)實(shí)際的文件(如
/tmp/my_task.lockfile
)關(guān)聯(lián)起來(lái)。
示例 4:阻塞模式與超時(shí)模式
flock -w 10 /tmp/my_task.lockfile echo "任務(wù)開(kāi)始執(zhí)行"
這個(gè)命令將等待最多 10 秒,如果在這段時(shí)間內(nèi)無(wú)法獲得鎖,它將退出并返回錯(cuò)誤。
總結(jié)
flock
是一個(gè)用于在 Linux/Unix 系統(tǒng)中實(shí)現(xiàn)文件鎖定的命令,常用于確保同一時(shí)間只有一個(gè)進(jìn)程執(zhí)行某個(gè)任務(wù)。- 通過(guò)
flock
,你可以在多個(gè)進(jìn)程之間進(jìn)行同步,避免競(jìng)態(tài)條件。 - 它支持阻塞模式(默認(rèn))和非阻塞模式,可以在
crontab
中使用,確保同一任務(wù)不會(huì)同時(shí)執(zhí)行。 - 你可以在腳本中使用
flock
通過(guò)鎖定文件來(lái)控制資源的訪問(wèn),避免多個(gè)進(jìn)程同時(shí)修改文件或執(zhí)行任務(wù)。
這種方法對(duì)于需要避免重復(fù)執(zhí)行的定時(shí)任務(wù)、日志文件的寫(xiě)入等場(chǎng)景非常有效。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在 Linux 命令行中使用 tcpdump 抓包的一些功能
tcpdump 是一款靈活、功能強(qiáng)大的抓包工具,能有效地幫助排查網(wǎng)絡(luò)故障問(wèn)題。接下來(lái)通過(guò)本文給大家介紹在 Linux 命令行中使用 tcpdump 抓包的一些常用功能,需要的朋友參考下吧2018-11-11Apache開(kāi)啟并實(shí)現(xiàn)網(wǎng)站偽靜態(tài)化的方法
Apache的Mod_Rewrite對(duì)URL進(jìn)行重寫(xiě),實(shí)現(xiàn)網(wǎng)站偽靜態(tài)化,這里就為大家介紹一下2022-08-08centos7安裝mysql并jdbc測(cè)試實(shí)例詳解
這篇文章主要介紹了centos7安裝mysql并jdbc測(cè)試實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-02-02VMware虛擬機(jī)安裝Linux系統(tǒng)圖文教程
這篇文章主要為大家詳細(xì)介紹了VMware虛擬機(jī)安裝Linux系統(tǒng)教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10Linux檢測(cè)遠(yuǎn)程服務(wù)器端口的幾種方法
作為系統(tǒng)管理員、網(wǎng)絡(luò)工程師或應(yīng)用程序開(kāi)發(fā)人員,需要檢查遠(yuǎn)程服務(wù)器上的端口是否打開(kāi),以便您可以判斷所檢查的服務(wù)是否正在運(yùn)行,所以本文給大家介紹了Linux檢測(cè)遠(yuǎn)程服務(wù)器端口的幾種方法,需要的朋友可以參考下2024-06-06在Ubuntu 16.10安裝mysql workbench報(bào)未安裝軟件包 libpng12-0錯(cuò)誤的解決方法
這篇文章主要介紹了在Ubuntu 16.10安裝mysql workbench報(bào)未安裝軟件包 libpng12-0錯(cuò)誤的解決方法的相關(guān)資料,需要的朋友可以參考下2016-11-11