每天乙個linux命令(6 18) lsof命令

2022-06-17 19:30:19 字數 3982 閱讀 5263

lsof(list open files)是乙個列出當前系統開啟檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體。所以,lsof的功能很強大。一般root使用者才能執行lsof命令,普通使用者可以看見/usr/sbin/lsof命令,但是普通使用者執行會顯示「permission denied」。因此通過lsof工具能夠檢視這個列表對系統監測以及排錯將是很有幫助的。所以如傳輸控制協議 (tcp) 和使用者資料報協議 (udp) 套接字等,系統在後台都為該應用程式分配了乙個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用介面

lsof(list open files),即:列出被程序所開啟的檔案的資訊,而被開啟的檔案可以是:

1.普通檔案

2.目錄

3.網路檔案系統的檔案

4.字元或裝置檔案

5.(函式)共享庫

6.管道,命名管道

7.符號鏈結

8.網路檔案(例如:nfs file、網路socket,unix網域名稱socket)

9.還有其它型別的檔案,等等

命令引數:

-a 列出開啟檔案存在的程序

-c《程序名》 列出指定程序所開啟的檔案

-g  列出gid號程序詳情

-d《檔案號》 列出占用該檔案號的程序

+d《目錄》  列出目錄下被開啟的檔案

+d《目錄》  遞迴列出目錄下被開啟的檔案

-n《目錄》  列出使用nfs的檔案

-i《條件》  列出符合條件的程序。(4、6、協議、:埠、 @ip )

-p《程序號》 列出指定程序號所開啟的檔案

-u  列出uid號程序詳情

-h 顯示幫助資訊

-v 顯示版本資訊

例項:  lsof -a :表示兩個引數都必須滿足時才顯示結果(-a:and的意思)

lsof -c string :顯示command列中包含指定字元的程序所有開啟的檔案(-c:command的意思)

注意:-c 引數後面可以跟上乙個正規表示式,如下例子

(1)lsof   -c   /^ssh?/

注意:/regex/i,後面的i表示不區分大小寫,此外還可以是b(普通正規表示式)、x(擴充套件表示式,預設為此項)

lsof -u username :顯示所屬user程序開啟的檔案(-u:user的意思)

lsof  -t  /path/file:顯示/path/file的程序id號

lsof -u:顯示所有unix domain socket files

lsof -g gid: 顯示歸屬gid的程序情況

lsof -s:列出開啟檔案的大小,如果沒有大小,則留下空白(-s:size的意思)

lsof [ -r | +r ] + 時間(s):表示每隔秒重新顯示輸出檔案資訊(例如:lsof  -r  3  /bin/bash,表示每隔3秒重新列出開啟/bin/bash該檔案相關的程序)(-r:表示repeat的意思)

(1)-r:該引數會讓lsof永遠不斷的執行,直到收到中斷訊號 

(2)+r:該引數會讓lsof一直執行,直到沒有檔案被顯示 

lsof +d /dir/: 顯示目錄下被程序開啟的檔案

lsof +d /dir/ :同上,但是會搜尋目錄下的所有目錄,時間相對較長

lsof -d fd: 顯示指定檔案描述符的程序

lsof -n :不將ip轉換為hostname,預設是不加上-n引數

lsof -i :用以顯示符合條件的程序情況

(1)如果-i後不跟任何引數,則表示顯示所有internet and x.25 (hp-ux) network files

(2)如果-i後跟一些引數,則表示相關的檔案

lsof -i [4 | 6] [protocol] [@hostname|hostaddr][:service|port]

解析如下:

46 --> ipv4 or ipv6

protocol --> tcp or udp

hostname --> internet host name

hostaddr --> ipv4位址

service --> /etc/service中的 service name (可以不只乙個)

port --> 埠號 (可以不只乙個)

lsof 常見的用法:是查詢應用程式開啟的檔案的名稱和數目。可用於查詢出某個特定應用程式將日誌資料記錄到何處,或者正在跟蹤某個問題。例如,linux限制了 進 程能夠開啟檔案的數目。通常這個數值很大,所以不會產生問題,並且在需要時,應用程式可以請求更大的值(直到某個上限)。如果你懷疑應用程式耗盡了檔案描 述符,那麼可以使用 lsof 統計開啟的檔案數目,以進行驗證

1)列出所有開啟的檔案                       lsof

備註:如果不加任何引數,就會開啟所有被開啟的檔案,建議加上一下引數來具體定位,每行顯示乙個開啟的檔案,若不指定條件預設將顯示所有程序開啟的所有檔案。

四、lsof與檔案恢復相關

例項二:恢復刪除的檔案當linux計算機受到入侵時,常見的情況是日誌檔案被刪除,以掩蓋攻擊者的蹤跡。管理錯誤也可能導致意外刪除重要的檔案,比如在清理舊日誌時,意外地刪除了資料庫的活動事務日誌,有時可以通過lsof來恢復這些檔案。 

當程序開啟了某個檔案時,只要該程序保持開啟該檔案,即使將其刪除,它依然存在於磁碟中,這意味著:程序並不知道檔案已經被刪除,它仍然可以向開啟該檔案時提供給它的檔案描述符進行讀取和寫入。除了該程序之外,這個檔案是不可見的,因為已經刪除了其相應的目錄索引節點。 在/proc 目錄下,其中包含了反映核心和程序樹的各種檔案,/proc目錄掛載的是在記憶體中所對映的一塊區域,所以這些檔案和目錄並不存在於磁碟中,因此當我們對這些檔案進行讀取和寫入時,實際上是在從記憶體中獲取相關資訊。大多數與 lsof 相關的資訊都儲存於以程序的 pid 命名的目錄中,即 /proc/1234 中包含的是 pid 為 1234 的程序的資訊。每個程序目錄中存在著各種檔案,它們可以使得應用程式簡單地了解程序的記憶體空間、檔案描述符列表、指向磁碟上的檔案的符號鏈結和其他系統資訊。lsof 程式使用該資訊和其他關於核心內部狀態的資訊來產生其輸出。所以lsof 可以顯示程序的檔案描述符和相關的檔名等資訊。也就是我們通過訪問程序的檔案描述符可以找到該檔案的相關資訊。 當系統中的某個檔案被意外地刪除了,只要這個時候系統中還有程序正在訪問該檔案,那麼我們就可以通過lsof從/proc目錄下恢復該檔案的內容

假如由於誤操作將/var/log/messages檔案刪除掉了,那麼這時要將/var/log/messages檔案恢復的方法如下: 首先使用lsof來檢視當前是否有程序開啟/var/logmessages檔案,如下: 

# lsof |grep /var/log/messages

syslogd 1283      root    2w      reg        3,3 5381017    1773647 /var/log/messages (deleted)

從上面的資訊可以看到 pid 1283(syslogd)開啟檔案的檔案描述符為 2。同時還可以看到/var/log/messages已經標記被刪除了。因此我們可以在 /proc/1283/fd/2 (fd下的每個以數字命名的檔案表示程序對應的檔案描述符)中檢視相應的資訊,如下: # head -n 10 /proc/1283/fd/2

aug 4 13:50:15 holmes86 syslogd : restart.

aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.

aug 4 13:50:15 holmes86 kernel: bios-e820: 0008000 - 000 (reserved)

從上面的資訊可以看出,檢視 /proc/8663/fd/15 就可以得到所要恢復的資料。如果可以通過檔案描述符檢視相應的資料,那麼就可以使用 i/o 重定向將其複製到檔案中,如: cat /proc/1283/fd/2 > /var/log/messages 

對於許多應用程式,尤其是日誌檔案和資料庫,這種恢復刪除檔案的方法非常有

每天乙個Linux命令

將我遇到的linux指令總結一下,不斷增加 1 sz和rz 一般來說,linux 伺服器大多是通過 ssh客戶端來進行遠端的登陸和管理的,使用 ssh登陸 linux ssh有關的兩個命令可以提供很方便的操作 sz 將選定的檔案傳送 send 到本地機器 rz 執行該命令會彈出乙個檔案選擇視窗,從本...

每天乙個linux命令

linux cmp命令 linux cmp命令用於比較兩個檔案是否有差異。當相互比較的兩個檔案完全一樣時,則該指令不會顯示任何資訊。若發現有所差異,缺省會標示出第乙個不同之處的字元和列數編號。若不指定任何檔名稱或是所給予的檔名為 則cmp指令會從標準輸入裝置讀取資料。語法cmp clsv i 字元數...

每天乙個 Linux 命令

head 與 tail 就像它的名字一樣的淺顯易懂,它是用來顯示開頭或結尾某個數量的文字區塊,head 用來顯示檔案的開頭至標準輸出中,而 tail 想當然爾就是看檔案的結尾。1 命令格式 head 引數 檔案 2 命令功能 head 用來顯示檔案的開頭至標準輸出中,預設head命令列印其相應檔案的...