2010-03-26 40 views
6

我試圖測試單個文件,如果使用lsof的是開放的。有沒有比這更快的方法?使用lsof查找單個打開文件的最快方法是什麼?

$result = exec('lsof | grep filename | wc -l'); 

if($result > 0) { 
    //file is open 
} 

我在想他們必須是一種方法來測試一個文件,如果你知道文件名。我真正需要的是真或假。

回答

9

我發現了一個更好的方法。隨着lsof的(在4.63版本測試),你可以直接查詢特定的文件:

if lsof filename > /dev/null; then 
    # file is open 
fi 
2

好了,你可以跳過wc和使用grep的返回值(grep的返回0(即成功),如果它檢測到的模式和1(即未成功),如果沒有檢測到模式):

if lsof | grep filename > /dev/null; then 
    # filename is in output of lsof 
fi 

您可以用grep的-l標誌有點改善這一點:

if lsof | grep -l filename > /dev/null; then 
... 

這告訴grep來停止尋找,一旦檢測到它的第一場比賽。

+0

如果你真的在乎那是一個使用該文件的過程中,更好地使用'-m 1'選項的grep,所以你實際上得到的匹配行,而不是匹配的中找到的文件名(標準輸入)。(否則,好的替代使用'-l'。) – Cascabel 2010-03-26 22:22:29

1

使用fuser。如果任何指定的文件正在使用,它將返回非零值,如果全部可用,則返回零。

1

不要。當你試圖對結果做任何事情時,答案可能會改變。相反,嘗試做任何你打算處理文件,並處理「使用中」錯誤或「共享違規」。

+0

適合你:+1,從我所看到的我認爲你可能是對的。雖然你的答案沒有具體回答這個問題。 – jjclarkson 2010-03-27 13:30:44

+0

賈裏德帕森斯對爲什麼這個問題本身是根本性的缺陷,一個很好的寫了起來:http://blogs.msdn.com/jaredpar/archive/2009/12/10/the-file-system-is-unpredictable.aspx 在這種情況下,最好不要回答這是問的問題,但本來應該問的問題。 – 2010-03-27 18:01:43

+0

-1有幾個原因。首先,「不」的答案也是*天真和誤導。有各種合法的原因希望直接查詢文件是否處於打開狀態或持有諮詢鎖,如調試,監視或提前警告用戶可能無法保存其更改。其次,Unix中的文件指針默認情況下不會強加任何類型的鎖定;除非明確使用'flock'或其他鎖定機制,否則您將無法獲取任何「正在使用」或「共享違規」錯誤 - 您只會愉快地亂動您的文件。 – 2016-08-11 14:14:20

相關問題