1、簡介
lsof(list open files)是一個列出當前系統打開文件的工具。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。
2、詳細解釋
在終端下輸入lsof即可顯示系統打開的文件,因爲 lsof 需要訪問核心內存和各種文件,所以必須以 root 用戶的身份運行它才能夠充分地發揮其功能。
2.1 顯示示例
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 3,3 1024 2 /
init 1 root rtd DIR 3,3 1024 2 /
init 1 root txt REG 3,3 38432 1763452 /sbin/init
init 1 root mem REG 3,3 106114 1091620 /lib/libdl-2.6.so
init 1 root mem REG 3,3 7560696 1091614 /lib/libc-2.6.so
init 1 root mem REG 3,3 79460 1091669 /lib/libselinux.so.1
init 1 root mem REG 3,3 223280 1091668 /lib/libsepol.so.1
init 1 root mem REG 3,3 564136 1091607 /lib/ld-2.6.so
init 1 root 10u FIFO 0,15 1309 /dev/initctl
2.2 各列解釋
每行顯示一個打開的文件,若不指定條件默認將顯示所有進程打開的所有文件。lsof輸出各列信息的意義如下:
COMMAND:進程的名稱
PID:進程標識符
USER:進程所有者
FD:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等
TYPE:文件類型,如DIR、REG等
DEVICE:指定磁盤的名稱
SIZE:文件的大小
NODE:索引節點(文件在磁盤上的標識)
NAME:打開文件的確切名稱
2.3 補充
其中FD 列中的文件描述符cwd 值表示應用程序的當前工作目錄,這是該應用程序啓動的目錄,除非它本身對這個目錄進行更改。txt 類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序。其次數值表示應用程序的文件描述符,這是打開該文件時返回的一個整數。如上的最後一行文件/dev/initctl,其文件描述符爲10u 表示該文件被打開並處於讀取/寫入模式,而不是隻讀 或只寫 (w) 模式。同時還有大寫
的W 表示該應用程序具有對整個文件的寫鎖。該文件描述符用於確保每次只能打開一個應用程序實例。初始打開每個應用程序時,都具有三個文件描述符,從 0 到 2,分別表示標準輸入、輸出和錯誤流。所以大多數應用程序所打開的文件的 FD 都是從 3 開始。
與 FD 列相比,Type 列則比較直觀。文件和目錄分別稱爲 REG 和 DIR。而CHR 和 BLK,分別表示字符和塊設備;或者 UNIX、FIFO 和 IPv4,分別表示 UNIX 域套接字、先進先出 (FIFO) 隊列和網際協議 (IP) 套接字。
3、語法
lsof [-?ahlnNPRsv][-c c][+|-d d][+|-D D][-g [s]] [+|-L [I]][-p s][+|-r [t]][-u s][names]
參數說明:若沒有加上任何參數,lsof會列出所有被程序開啓的文件。
-? -h 這兩個參數意思相同,顯示出lsof的使用說明 -a 參數被視爲AND,會影響全部的參數
-C c 顯示出以字符或字符串c開頭的命令程序開啓的文件,如$lsof -C init
+d s 在文件夾s下搜尋,此參數不會繼續深入搜尋此文件夾。如顯示在/usr/local下被程序開啓的文件:$lsof +d /usr/local +D D 同上,但是會以該文件爲基礎往下全部搜尋,這樣花費較大的CPU時間,請謹慎使用
-d s 此參數以file descriptor(FD)值顯示結果,可以採用範圍(1-3)或個別,如顯示FD爲4的進程:$lsof -d 4
-g [s] 以程序的PGID顯示,也可以採用範圍或個別表示,若沒有特別指定,則顯示全部,如顯示PGID爲6的進程:$lsof -g 6
-i 用以監聽有關的任何符合的地址,若沒有相關地址被指定,則監聽全部
語法: lsof -i [46][protocol][@hostname|hostaddr][:serivce|port]
說明: 46 IPv4 or IPv6
protocol TCP or UDP
hostname internet
host name
hostaddr
IPv4地址
service /etc/service中的service
name
port 端口號
-l 此參數禁止將user ID 轉換爲登錄的名稱,默認是登錄名稱
+|-L [l] +或-表示開啓或關閉顯示文件連接數,如果只有單純的+L,後面沒有任何數字,則表示顯示全部,如果後面有數字,只有文件連接數少於該數字的會被列出
-n 不將IP地址轉換爲hostname,預設是轉換的
-N 顯示NFS的文件
-p s 以PID作爲顯示的依據
-P 此參數禁止將port number轉換爲service name,預設爲轉換
+|-r [t] 控制lsof不斷重複執行,t爲15秒,也就是說每隔15秒再重複執行 +r 一直執行,直到沒有文件被顯示 -r 永遠 不斷的執行,直到收到中斷訊號(ctrl+ c)
-R 此參數增列出PID的子程序,也就是PPID
u s 列出login name或UID爲的程序
-v 顯示lsof的版本信息
參考文獻:百度百科和http://linux.chinaunix.net/techdoc/system/2007/12/20/974736.shtml