天天看點

linux lsof指令詳解:列出目前系統打開的檔案

作者:雲計算練習生

一、lsof指令簡介

lsof(list open files)是一個列出目前系統打開檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以通路正常資料,還可以通路網絡連接配接和硬體。是以如傳輸控制協定 (TCP) 和使用者資料報協定 (UDP) 套接字等,系統在背景都為該應用程式配置設定了一個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用接口。因為應用程式打開檔案的描述符清單提供了大量關于這個應用程式本身的資訊,是以通過lsof工具能夠檢視這個清單對系統監測以及排錯将是很有幫助的。

二、輸出資訊含義

在終端下輸入lsof即可顯示系統打開的檔案,因為 lsof 需要通路核心記憶體和各種檔案,是以必須以 root 使用者的身份運作它才能夠充分地發揮其功能。

直接輸入lsof部分輸出為:

内容很多,非常多,隻截取開頭部分

linux lsof指令詳解:列出目前系統打開的檔案

每行顯示一個打開的檔案,若不指定條件預設将顯示所有程序打開的所有檔案。

lsof輸出各列資訊的意義如下:

COMMAND:程序的名稱 PID:程序辨別符

USER:程序所有者

FD:檔案描述符,應用程式通過檔案描述符識别該檔案。如cwd、txt等 TYPE:檔案類型,如DIR、REG等

DEVICE:指定磁盤的名稱

SIZE:檔案的大小

NODE:索引節點(檔案在磁盤上的辨別)

NAME:打開檔案的确切名稱

FD 列中的檔案描述符cwd 值表示應用程式的目前工作目錄,這是該應用程式啟動的目錄,除非它本身對這個目錄進行更改,txt 類型的檔案是程式代碼,如應用程式二進制檔案本身或共享庫,如上清單中顯示的 /sbin/init 程式。

其次數值表示應用程式的檔案描述符,這是打開該檔案時傳回的一個整數。如上的最後一行檔案/dev/initctl,其檔案描述符為 10。u 表示該檔案被打開并處于讀取/寫入模式,而不是隻讀 ® 或隻寫 (w) 模式。同時還有大寫 的W 表示該應用程式具有對整個檔案的寫鎖。該檔案描述符用于確定每次隻能打開一個應用程式執行個體。初始打開每個應用程式時,都具有三個檔案描述符,從 0 到 2,分别表示标準輸入、輸出和錯誤流。是以大多數應用程式所打開的檔案的 FD 都是從 3 開始。

與 FD 列相比,Type 列則比較直覺。檔案和目錄分别稱為 REG 和 DIR。而CHR 和 BLK,分别表示字元和塊裝置;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先進先出 (FIFO) 隊列和網際協定 (IP) 套接字。

三、常用參數

lsof文法格式是: lsof [options] filename

lsof -c ssh 顯示ssh程序現在打開的檔案,内容很多

linux lsof指令詳解:列出目前系統打開的檔案

lsof -c -p 11617列出程序号為11617的程序所打開的檔案

linux lsof指令詳解:列出目前系統打開的檔案

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

linux lsof指令詳解:列出目前系統打開的檔案

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

linux lsof指令詳解:列出目前系統打開的檔案

lsof +D /usr/local/ 同上,但是會搜尋目錄下的目錄,時間較長

linux lsof指令詳解:列出目前系統打開的檔案

lsof -d 4 顯示使用fd為4的程序

linux lsof指令詳解:列出目前系統打開的檔案

四、lsof使用執行個體

查找誰在使用檔案系統

怎樣使用lsof

這裡主要用案例的形式來介紹lsof 指令的使用

4.1.列出所有打開的檔案lsof

linux lsof指令詳解:列出目前系統打開的檔案

備注: 如果不加任何參數,就會打開所有被打開的檔案,建議加上一下參數來具體定位

4.2. 檢視誰正在使用某個檔案

lsof /etc/yum.repos.d/

linux lsof指令詳解:列出目前系統打開的檔案

4.4遞歸檢視某個目錄的檔案資訊

lsof +D /etc

linux lsof指令詳解:列出目前系統打開的檔案

備注: 使用了+D,對應目錄下的所有子目錄和檔案都會被列出

4.4 比使用+D選項,周遊檢視某個目錄的所有檔案資訊 的方法

lsof | grep /usr/lib/

linux lsof指令詳解:列出目前系統打開的檔案

4.5 列出某個使用者打開的檔案資訊

lsof -u root 内容很多

linux lsof指令詳解:列出目前系統打開的檔案

備注: -u 選項,u其實是user的縮寫

4.6 列出某個程式所打開的檔案資訊

lsof -c httpd

linux lsof指令詳解:列出目前系統打開的檔案

備注: -c 選項将會列出所有以mysql開頭的程式的檔案,其實你也可以寫成lsof | grep mysql,但是第一種方法明顯比第二種方法要少打幾個字元了

其他案例有興趣自己試試,我就不示範了!!!

7. 列出多個程式多打開的檔案資訊

lsof -c mysql -c apache

8. 列出某個使用者以及某個程式所打開的檔案資訊

lsof -u test -c mysql

9. 列出除了某個使用者外的被打開的檔案資訊

lsof -u ^root

備注:^這個符号在使用者名之前,将會把是root使用者打開的程序不讓顯示

10. 通過某個程序号顯示該進行打開的檔案

lsof -p 1

11. 列出多個程序号對應的檔案資訊

lsof -p 123,456,789

12. 列出除了某個程序号,其他程序号所打開的檔案資訊

lsof -p ^1

13 . 列出所有的網絡連接配接

lsof -i

14. 列出所有tcp 網絡連接配接資訊

lsof -i tcp

15. 列出所有udp網絡連接配接資訊

lsof -i udp

16. 列出誰在使用某個端口

lsof -i :3306

17. 列出誰在使用某個特定的udp端口

lsof -i udp:55

特定的tcp端口

lsof -i tcp:80

18. 列出某個使用者的所有活躍的網絡端口

lsof -a -u test -i

19. 列出所有網絡檔案系統

lsof -N

20.域名socket檔案

lsof -u

21.某個使用者組所打開的檔案資訊

lsof -g 5555

22. 根據檔案描述列出對應的檔案資訊

lsof -d description(like 2)

有不對的地方希望不吝賜教,歡迎在評論區留言,分享你的看法。

繼續閱讀