lsof - list open files

原文鏈接 :  http://blog.chinaunix.net/uid-25203957-id-2855837.html

請多多支持原作者,謝謝...

這應該是我所看到最詳細的關於lsof的解析了.說下我關心這個命令的背景.

前段時間遇到一個BUG,就是明明文件一直在刪除,但是磁盤空間就是不釋放.這個場景很好復現,你只要打開一個文件描述符,然後刪除文件.然後通過du和df結合對比,就可以看到很明顯的差異(當然前提是你的文件要足夠大,大到可以讓你看出差異).

遇到如此怪的現象,我瞬間麻爪,完全不知道發生了什麼,正準備打電話申請換磁盤,大牛哥一條命令搞定...就是下面這個lsof命令.

lsof : 輸出進程資源佔用信息.(man手冊裏面說 list open files,這樣說也沒錯,畢竟linux皆文件嘛).


轉載正文 :

lsof輸出各列信息的意義如下:
COMMAND:進程的名稱
PID:進程標識符
USER:進程所有者
FD:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等
TYPE:文件類型,如DIR、REG等
DEVICE:指定磁盤的名稱
SIZE:文件的大小
NODE:索引節點(文件在磁盤上的標識)
NAME:打開文件的確切名稱

其中FD 列中的文件描述符cwd 值表示應用程序的當前工作目錄,這是該應用程序啓動的目錄,除非它本身對這個目錄進行更改。
txt 類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序。
其次數值表示應用程序的文件描述符,這是打開該文件時返回的一個整數。

u 表示該文件被打開並處於讀取/寫入模式,而不是隻讀 ? 或只寫 (w) 模式。同時還有大寫的W 表示該應用程序具有對整個文件的寫鎖。該文件描述符用於確保每次只能打開一個應用程序實例。

初始打開每個應用程序時,都具有三個文件描述符,從 0 到 2,分別表示標準輸入、輸出和錯誤流。所以大多數應用程序所打開的文件的 FD 都是從 3開始。

與 FD 列相比,Type 列則比較直觀。文件和目錄分別稱爲 REG 和 DIR。而CHR和BLK,分別表示字符和塊設備;或者 UNIX、FIFO 和 IPv4,分別表示 UNIX 域套接字、先進先出 (FIFO) 隊列和網際協議 (IP) 套接字。


1、當在lsof後邊沒有跟任何參數時,該命令將會列出當前系統中被所有進程打開的所有文件
#lsof|nl     #nl命令打印出行號

2、下邊這幾個命令指出打開某文件的進程

#lsof `which httpd`    #那個進程在使用apache的可執行文件
#lsof /etc/passwd      #那個進程在佔用/etc/passwd
#lsof /dev/hda6        #那個進程在佔用hda6
#lsof /dev/cdrom       #那個進程在佔用光驅

3、下邊將會打印出佔用httpd可執行文件的進程的進程號(僅僅是進程號,在編寫shell腳本是有用)
#lsof -t `which httpd`

4、顯示出那些文件被以k打頭的進程名的進程打開,以bash打頭,和以init打頭:
#lsof -c k
#lsof -c bash
#lsof -c init

5、顯示出那些文件被以courier打頭的進程打開,但是並不屬於用戶‘zahn’
#lsof -c courier -u ^zahn

6、顯示被zahn和apache打開的文件
#lsof -u apache,zahn

7、顯示那些文件被pid爲30297的進程打開:
#lsof +p 30297

8、顯示所有在/tmp文件夾中打開的instance和文件的進程。但是symbol文件並不在列
#lsof -D /tmp

9、顯示所有打開的端口
#lsof -i
10、顯示所有打開80端口的進程
#lsof -i:80

11、顯示所有打開的端口和UNIX domain文件:
#lsof -i -U

12、顯示那些進程打開了到www.akadia.com的UDP的123(ntp)端口的鏈接:

13、列出Internet, x.25 (HP-UX), and UNIX domain 文件:
#lsof -i -U

14、列出指定進程打開的IPv4文件:
#lsof -i 4 -a -p 1234  (-a 參數被視爲 AND )

15、列出指定進程打開的IPv4文件:
#lsof -i 6

16、列出使用 /dev/log的文件:
#lsof /dev/log

17、獲取每個進程的PID,命令名。進程每個文件的文件描述符,文件設備號,文件inode :
#lsof –FpcfDi

18、獲取工作目錄的第3個字符是'o' or 'O'的進程:
#lsof -c /^..o.$/i -a -d cwd  (-a 參數被視爲 AND )

19、獲取和指定IP有關的socket 文件:

20、Unlinked的打開文件:
#lsof +L1

21、查找監聽的socket
#lsof –i

22、查找指定進程號或進程名使用的文件
lsof -p

23、遠程登陸偵測
 #lsof /dev/pts/0

24、NFS文件
$ lsof –N

25、指定用戶打開的文件
 
lsof -u ^root

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章