lsof全名list opened files,也就是列舉系統中已經被開啟的檔案。我們都知道,linux環境中,任何事物都是檔案,裝置是檔案,目錄是檔案,甚至sockets也是檔案。所以,用好lsof命令,對日常的linux管理非常有協助。以下的說明,大部分內容來自lsof的manual文檔。我所做的只是在中文翻譯的基礎上,進行簡單的分類說明,並列舉最常用的參數。
lsof –i :<連接埠號碼>
lsof –i協議類型@IP地址:連接埠號碼
lsof命令解析
| 選項 |
選項文法 |
說明 |
| lsof -i |
lsof -i[46][protocol][@hostname|hostaddr][:service|port] 46 --> IPv4或者IPv6 protocol --> TCP、UDP hostname --> Internet host name hostaddr --> IPv4地址 service --> /etc/service中的 service name (可以不只一個) port --> 連接埠號碼 (可以不只一個) |
查看指定的協議、主機、連接埠等網路資訊 |
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| lsof -n |
lsof -n |
不將IP轉換為hostname,預設是不加上-n參數 |
| lsof +c |
lsof +c <num> num為0表示,顯示命令的全部名稱 num不為0表示,按該值截斷命令名稱 |
調整結果COMMAND列顯示命令名稱的輸出寬度,預設最大為9個字元。 |
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
lsof用在網路檢查方面的例子
例子:知道連接埠號碼,得到開啟該連接埠的進程
顯示誰開啟了原生某個連接埠(比如本機IP為:172.16.31.63,連接埠號碼為:32782)使用命令及結果如下:
root@motadou:~# lsof -i :32782COMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEmyTest 409 root 30u IPv4 4075 TCP 172.16.31.63:32782->172.30.6.56:3306 (ESTABLISHED)如果我們知道該連接埠的協議類型,還可以使用使用如下的命令root@motadou:~# lsof -iTCP@172.16.31.63:32782COMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEmyTest 409 root 30u IPv4 4075 TCP 172.16.31.63:32782->172.30.6.56:3306 (ESTABLISHED)從輸出結果可以看到,開啟172.16.31.63:32782連接埠的程式是myTest,它的進程號是409,對端地址是172.30.6.56:3306。
例子:查看進程開啟了哪些檔案
lsof -p pid
----
如下摘抄
lsof是一個用來顯示被開啟的檔案的強大而有用的工具。在Unix系統中,任何事物都是檔案(everything is a file),pipe是檔案,IP sockets是檔案,unix sockets是檔案,目錄是檔案,裝置是檔案,inodes是檔案。
一些有用的例子:
當在lsof後邊沒有跟任何參數時,該命令將會列出當前系統中被所有進程開啟的所有檔案
lsof|nl #nl命令列印出行號
下邊這幾個命令指出開啟某檔案的進程
lsof `which httpd` #那個進程在使用apache的可執行檔
lsof /etc/passwd #那個進程在佔用/etc/passwd
lsof /dev/hda6 #那個進程在佔用hda6
lsof /dev/cdrom #那個進程在佔用光碟機
下邊將會列印出佔用httpd可執行檔的進程的進程號(僅僅是進程號,在編寫shell指令碼是有用)
lsof -t `which httpd`
顯示出那些檔案被以k打頭的進程名的進程開啟,以bash打頭,和以init打頭:
lsof -c k
lsof -c bash
lsof -c init
顯示出那些檔案被以courier打頭的進程開啟,但是並不屬於使用者‘zahn’
lsof -c courier -u ^zahn
顯示被zahn和apache開啟的檔案
lsof -u apache,zahn
顯示那些檔案被pid為30297的進程開啟:
lsof +p 30297
顯示所有在/tmp檔案夾中開啟的instance和檔案的進程。但是symbol檔案並不在列
lsof -D /tmp
顯示所有開啟的連接埠
lsof -i
顯示所有開啟80連接埠的進程
lsof -i:80
顯示所有開啟的連接埠和UNIX domain檔案:
lsof -i -U
顯示那些進程開啟了到www.akadia.com的UDP的123(ntp)連接埠的連結:
lsof -iUDP@www.akadia.com:123
lsofabc.txt顯示開啟檔案abc.txt的進程
lsof-i:22知道22連接埠現在運行什麼程式
lsof-cnsd顯示nsd進程現在開啟的檔案
lsof-ggid顯示歸屬gid的進程情況
lsof d/usr/local/顯示目錄下被進程開啟的檔案
lsof D/usr/local/同上,但是會搜尋目錄下的目錄,時間較長
lsof-d4顯示使用fd為4的進程
lsof-i用以顯示合格進程情況
文法:lsof-i[46][protocol][@hostname|hostaddr][:service|port]
46-->IPv4orIPv6
protocol-->TCPorUDP
hostname-->Internethostname
hostaddr-->IPv4位置
service-->/etc/service中的servicename(可以不只一個)
port-->埠號(可以不只一個)
例子:TCP:25-TCPandport25
@1.2.3.4-InternetIPv4hostaddress1.2.3.4
tcp@ohaha.ks.edu.tw:ftp-TCPprotocolhost:ohaha.ks.edu.twservicename:ftp
lsof-n不將IP轉換為hostname,預設是不加上-n參數
例子:lsof-itcp@ohaha.ks.edu.tw:ftp-n
lsof-p12看進程號為12的進程開啟了哪些檔案
lsof |-r[t]控制lsof不斷重複執行,預設是15s重新整理
-r,lsof會永遠不斷的執行,直到收到中斷訊號
r,lsof會一直執行,直到沒有檔案被顯示
例子:不斷查看目前ftp串連的情況:lsof-itcp@ohaha.ks.edu.tw:ftp-r
lsof-s列出開啟檔案的大小,如果沒有大小,則留下空白
lsof-uusername以UID,列出開啟的檔案