linux文件鎖
1. linux shell中的加鎖
flock的選項-n等同於--nonblock,表示非阻塞模式。man flock可以看到詳細說明:
Fail (with an exit code of 1) rather than wait if the lock cannot be immediately acquired.
翻譯過來就是,若不能立即獲得文件鎖,就直接出錯返回1而不是繼續等待(默認flock是會繼續等待直到獲得文件鎖)。
3就是fd(即文件描述符)。
文件鎖只是用於防止多個程序同時訪問一個文件的沖突情況。
Shell自動分配fd的話,原本就不會使用已被佔用的fd,而是自動遞增。
這里顯式指定fd為3(3<>mylockfile),是為了flock有操作的對象。只有unlock後文件才能被其他程序訪問,這樣就可以保證文件訪問不沖突。
2. 定Linux查看文件被鎖定狀態的方法linux查看文件鎖
Linux系統上文件被鎖定時,多是為了防止多個用戶同時修改同一個文件,給操作系統帶來信心,維護系統穩定性。因此,開發者特別關注Linux系統上查看文件是否被鎖定的腳本功能,一般可以通過以下方法定位這一問題:
1.使用’fuser’命令查看每一個文件的狀態,以及它的文件所屬的用戶,以及正在運行的程序ID。我們可以使用下面的命令查看目標文件情況:
`fuser filename`
2.除了使用’fuser’命令外,我們還可以使用’lsof’命令來查看文件是否被誰鎖定。我們可以使用下面的命令查看情況:
`lsof filename`
3.我們也可以使用’ps’命令來查詢哪個進程正在操作文件,可以使用以下命令查看:
`ps -ef |grep filename`
但是這些命令並不一定能准確給我們顯示文件是否被鎖定,這時就需要我們通過’strace’跟蹤工具來檢查該文件有沒有被打開,以及被誰打開,以及打開的模式。
可以使用以下’strace’命令來查看:
` strace -C -f -e trace=open `
上述命令會顯示程序試圖訪問文件的狀態,以及文件正在被那個程序打開。通過觀察輸出結果,可以得出文件被鎖定的信息。
Linux上查看文件是否被鎖定的方法就介紹到這里,大家也可以使用上述代碼進行檢查,將上述腳本放入自動化腳本或者監控系統中,進行文件是否正常使用檢查。通過以上方法,任何用戶都可以查看文件是否被鎖定,以及被鎖定是否符合一定條件,保護系統讀寫文件的正常性。
3. linux 文件鎖,當一個進程對一個文件上了寫鎖以後,因異常退出而沒有釋放鎖,其他進程還能讀被鎖住的區段
可以讀取,但是不能寫入了:
chattr +i /etc/passwd
就不能在創建用戶了
除非解鎖:
chattr-i /etc/passwd
4. linux中fcntl()函數的使用
前面的這5個基本函數實現了文件的打開、讀寫等基本操作,這一節將討論的是,在文 件已經共享的情況下如何操作,也就是當多個用戶共同使用、操作一個文件的情況,這時,Linux 通常採用的方法是給文件上鎖,來避免共享的資源產生競爭的狀態。
文件鎖包括建議性鎖和強制性鎖。
建議性鎖要求每個上鎖文件的進程都要檢查是否有鎖存,並且尊重已有的鎖。在一般情況下,內核和系統都不使用建議性鎖。強制性鎖是由內 核執行的鎖,當一個文件被上鎖進行寫入操作的時候,內核將阻止其他任何文件對其進行讀寫操作。採用強制性鎖對性能的影響很大,每次讀寫操作都必須檢查是否有鎖存在。
在 Linux 中,實現文件上鎖的函數有lock和fcntl,其中flock用於對文件施加建議性鎖,而fcntl不僅可以施加建議性鎖,還可以施加強制鎖。同時,fcntl還能對文件的某一記錄進行上鎖,也就是記錄鎖。
記錄鎖又可分為讀取鎖和寫入鎖,其中讀取鎖又稱為共享鎖,它能夠使多個進程都能在文件的同一部分建立讀取鎖。而寫入鎖又稱為排斥鎖,在任何時刻只能有一個進程在文件的某個部分上建立寫入鎖。當然,在文件的同一部分不能同時建立讀取鎖和寫入鎖。