lsof(list open files)是一個列出當前系統打開文件的工具。在Linux環境下,任何事物都是以文件的形式存在,通過文件不僅可以訪問常規數據,還可以訪問網絡連接和硬件。所以,如傳輸控制協議(TCP)和用戶數據報協議(UDP)套接字等,系統在后台都為該應用程序分配了一個文件描述符,無論這個文件的本質如何,該文件描述符為應用程序與基礎操作系統之間的交互提供了通用接口。因為應用程序打開文件的描述符列表提供了大量關於這個應用程序本身的信息,因此通過lsof工具能夠查看這個列表對系統監測以及排錯是很有幫助的。
圖1:lsof示例
在終端下輸入lsof即可顯示系統打開的文件,因為lsof需要訪問核心內存和各種文件,所以必須以root用戶的身份運行它才能夠充分地發揮功能。
如上圖1是一個lsof的輸出例子,每行顯示一個打開的文件,若不指定默認顯示所有進程打開的所有文件。
lsof輸出各列信息的意義如下:
COMMAND:進程的名稱
PID:進程標識符
USER:進程所有者
FD:文件描述符,應用程序通過文件描述符識別該文件,如cwd、txt等。
TYPE:文件類型,如:DIR、REG等。
DEVICE:指定磁盤的名稱
SIZE:文件的大小
NODE:索引節點(文件在磁盤上的標識)
NAME:打開文件的確切名稱
FD列中的文件描述符cwd值表示應用程序的當前工作目錄,這是該應用程序啟動的目錄,除非它本身對這個目錄進行更改,txt類型的文件是程序代碼,如應用程序二進制文件本身或共享庫。其次數值標識應用程序的文件描述符,這是打開該文件時返回的一個整數。與 FD 列相比,Type 列則比較直觀。文件和目錄分別稱為REG和DIR。而CHR和BLK,分別表示字符和塊設備;或者UNIX、FIFO和IPv4,分別表示UNIX域套接字、先進先出(FIFO)隊列和網際協議(IP)套接字。
下面是一些實用的命令:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
lsof
`
which
httpd`
//
那個進程在使用apache的可執行文件
lsof
/etc/passwd
//
那個進程在占用
/etc/passwd
lsof
/dev/hda6
//
那個進程在占用hda6
lsof
/dev/cdrom
//
那個進程在占用光驅
lsof
-c sendmail
//
查看sendmail進程的文件使用情況
lsof
-c courier -u ^zahn
//
顯示出那些文件被以courier打頭的進程打開,但是並不屬於用戶zahn
lsof
-p 30297
//
顯示那些文件被pid為30297的進程打開
lsof
-D
/tmp
顯示所有在
/tmp
文件夾中打開的instance和文件的進程。但是symbol文件並不在列
lsof
-u1000
//
查看uid是100的用戶的進程的文件使用情況
lsof
-utony
//
查看用戶tony的進程的文件使用情況
lsof
-u^tony
//
查看不是用戶tony的進程的文件使用情況(^是取反的意思)
lsof
-i
//
顯示所有打開的端口
lsof
-i:80
//
顯示所有打開80端口的進程
lsof
-i -U
//
顯示所有打開的端口和UNIX domain文件
lsof
-i UDP@[url]www.akadia.com:123
//
顯示那些進程打開了到www.akadia.com的UDP的123(ntp)端口的鏈接
lsof
-i tcp@ohaha.ks.edu.tw:
ftp
-r
//
不斷查看目前
ftp
連接的情況(-r,
lsof
會永遠不斷的執行,直到收到中斷信號,+r,
lsof
會一直執行,直到沒有檔案被顯示,缺省是15s刷新)
lsof
-i tcp@ohaha.ks.edu.tw:
ftp
-n
//lsof
-n 不將IP轉換為
hostname
,缺省是不加上-n參數
|
可以使用lsof -i:端口號來查看當前有哪些程序占用了某個端口。