原文鏈接 : 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