天天看點

linux lsof指令詳解

1.lsof指令:根據程序pid查端口:

lsof -i | grep pid      

其中,java表示項目運作類型,22636表示程序号,rssp表示使用者名,10150為TOMCAT_HTTP_PORT端口号,

10153為TOMCAT_HTTPS_PORT端口号,

10152為TOMCAT_SHUTDOWN_PORT端口号,

10154為TOMCAT_AJP_PORT端口号,

2.根據端口port查程序:

lsof -i:port      

3. netstat指令根據程序pid查端口:

netstat -nap | grep pid      

參考:linux lsof/netstat檢視程序和端口号相關指令:

 簡介

lsof(list open files)是一個列出目前系統打開檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以通路正常資料,還可以通路網絡連接配接和硬體。是以如傳輸控制協定 (TCP) 和使用者資料報協定 (UDP) 套接字等,系統在背景都為該應用程式配置設定了一個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用接口。因為應用程式打開檔案的描述符清單提供了大量關于這個應用程式本身的資訊,是以通過lsof工具能夠檢視這個清單對系統監測以及排錯将是很有幫助的。

輸出資訊含義

在終端下輸入lsof即可顯示系統打開的檔案,因為 lsof 需要通路核心記憶體和各種檔案,是以必須以 root 使用者的身份運作它才能夠充分地發揮其功能。

直接輸入lsof部分輸出為:

linux lsof指令詳解
linux lsof指令詳解
COMMAND     PID        USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME init          1        root  cwd       DIR                8,1     4096          2 / init          1        root  rtd       DIR                8,1     4096          2 / init          1        root  txt       REG                8,1   150584     654127 /sbin/init udevd       415        root    0u      CHR                1,3      0t0       6254 /dev/null udevd       415        root    1u      CHR                1,3      0t0       6254 /dev/null udevd       415        root    2u      CHR                1,3      0t0       6254 /dev/null udevd       690        root  mem       REG                8,1    51736     302589 /lib/x86_64-linux-gnu/libnss_files-2.13.so syslogd    1246      syslog    2w      REG                8,1    10187     245418 /var/log/auth.log syslogd    1246      syslog    3w      REG                8,1    10118     245342 /var/log/syslog dd         1271        root    0r      REG                0,3        0 4026532038 /proc/kmsg dd         1271        root    1w     FIFO               0,15      0t0        409 /run/klogd/kmsg dd         1271        root    2u      CHR                1,3      0t0       6254 /dev/null      
linux lsof指令詳解
linux lsof指令詳解

每行顯示一個打開的檔案,若不指定條件預設将顯示所有程序打開的所有檔案。

lsof輸出各列資訊的意義如下:

COMMAND:程序的名稱 PID:程序辨別符

USER:程序所有者

FD:檔案描述符,應用程式通過檔案描述符識别該檔案。如cwd、txt等 TYPE:檔案類型,如DIR、REG等

DEVICE:指定磁盤的名稱

SIZE:檔案的大小

NODE:索引節點(檔案在磁盤上的辨別)

NAME:打開檔案的确切名稱

FD 列中的檔案描述符cwd 值表示應用程式的目前工作目錄,這是該應用程式啟動的目錄,除非它本身對這個目錄進行更改,txt 類型的檔案是程式代碼,如應用程式二進制檔案本身或共享庫,如上清單中顯示的 /sbin/init 程式。

其次數值表示應用程式的檔案描述符,這是打開該檔案時傳回的一個整數。如上的最後一行檔案/dev/initctl,其檔案描述符為 10。u 表示該檔案被打開并處于讀取/寫入模式,而不是隻讀 ® 或隻寫 (w) 模式。同時還有大寫 的W 表示該應用程式具有對整個檔案的寫鎖。該檔案描述符用于確定每次隻能打開一個應用程式執行個體。初始打開每個應用程式時,都具有三個檔案描述符,從 0 到 2,分别表示标準輸入、輸出和錯誤流。是以大多數應用程式所打開的檔案的 FD 都是從 3 開始。

與 FD 列相比,Type 列則比較直覺。檔案和目錄分别稱為 REG 和 DIR。而CHR 和 BLK,分别表示字元和塊裝置;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先進先出 (FIFO) 隊列和網際協定 (IP) 套接字。

常用參數

lsof文法格式是: lsof [options] filename

linux lsof指令詳解
lsof abc.txt 顯示開啟檔案abc.txt的程序 lsof -c abc 顯示abc程序現在打開的檔案 lsof -c -p 1234 列出程序号為1234的程序所打開的檔案 lsof -g gid 顯示歸屬gid的程序情況 lsof +d /usr/local/ 顯示目錄下被程序開啟的檔案 lsof +D /usr/local/ 同上,但是會搜尋目錄下的目錄,時間較長 lsof -d 4 顯示使用fd為4的程序 lsof -i 用以顯示符合條件的程序情況 lsof -i[46] [protocol][@hostname|hostaddr][:service|port]   46 --> IPv4 or IPv6   protocol --> TCP or UDP   hostname --> Internet host name   hostaddr --> IPv4位址   service --> /etc/service中的 service name (可以不止一個)   port --> 端口号 (可以不止一個)      
linux lsof指令詳解

lsof使用執行個體

查找誰在使用檔案系統

在解除安裝檔案系統時,如果該檔案系統中有任何打開的檔案,操作通常将會失敗。那麼通過lsof可以找出那些程序在使用目前要解除安裝的檔案系統,如下: # lsof /GTES11/ COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME bash 4208 root cwd DIR 3,1 4096 2 /GTES11/ vim 4230 root cwd DIR 3,1 4096 2 /GTES11/ 在這個示例中,使用者root正在其/GTES11目錄中進行一些操作。一個 bash是執行個體正在運作,并且它目前的目錄為/GTES11,另一個則顯示的是vim正在編輯/GTES11下的檔案。要成功地解除安裝/GTES11,應該在通知使用者以確定情況正常之後,中止這些程序。 這個示例說明了應用程式的目前工作目錄非常重要,因為它仍保持着檔案資源,并且可以防止檔案系統被解除安裝。這就是為什麼大部分守護程序(背景程序)将它們的目錄更改為根目錄、或服務特定的目錄(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免該守護程序阻止解除安裝不相關的檔案系統。

恢複删除的檔案

當Linux計算機受到入侵時,常見的情況是日志檔案被删除,以掩蓋攻擊者的蹤迹。管理錯誤也可能導緻意外删除重要的檔案,比如在清理舊日志時,意外地删除了資料庫的活動事務日志。有時可以通過lsof來恢複這些檔案。 當程序打開了某個檔案時,隻要該程序保持打開該檔案,即使将其删除,它依然存在于磁盤中。這意味着,程序并不知道檔案已經被删除,它仍然可以向打開該檔案時提供給它的檔案描述符進行讀取和寫入。除了該程序之外,這個檔案是不可見的,因為已經删除了其相應的目錄索引節點。 在/proc 目錄下,其中包含了反映核心和程序樹的各種檔案。/proc目錄挂載的是在記憶體中所映射的一塊區域,是以這些檔案和目錄并不存在于磁盤中,是以當我們對這些檔案進行讀取和寫入時,實際上是在從記憶體中擷取相關資訊。大多數與 lsof 相關的資訊都存儲于以程序的 PID 命名的目錄中,即 /proc/1234 中包含的是 PID 為 1234 的程序的資訊。每個程序目錄中存在着各種檔案,它們可以使得應用程式簡單地了解程序的記憶體空間、檔案描述符清單、指向磁盤上的檔案的符号連結和其他系統資訊。lsof 程式使用該資訊和其他關于核心内部狀态的資訊來産生其輸出。是以lsof 可以顯示程序的檔案描述符和相關的檔案名等資訊。也就是我們通過通路程序的檔案描述符可以找到該檔案的相關資訊。 當系統中的某個檔案被意外地删除了,隻要這個時候系統中還有程序正在通路該檔案,那麼我們就可以通過lsof從/proc目錄下恢複該檔案的内容。 假如由于誤操作将/var/log/messages檔案删除掉了,那麼這時要将/var/log/messages檔案恢複的方法如下: 首先使用lsof來檢視目前是否有程序打開/var/logmessages檔案,如下: # lsof |grep /var/log/messages syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted) 從上面的資訊可以看到 PID 1283(syslogd)打開檔案的檔案描述符為 2。同時還可以看到/var/log/messages已經标記被删除了。是以我們可以在 /proc/1283/fd/2 (fd下的每個以數字命名的檔案表示程序對應的檔案描述符)中檢視相應的資訊,如下: # head -n 10 /proc/1283/fd/2 Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart. Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started. Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 ([email protected]) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007 Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map: Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 - 000000000009f000 (usable) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved) 從上面的資訊可以看出,檢視 /proc/8663/fd/15 就可以得到所要恢複的資料。如果可以通過檔案描述符檢視相應的資料,那麼就可以使用 I/O 重定向将其複制到檔案中,如: cat /proc/1283/fd/2 > /var/log/messages 對于許多應用程式,尤其是日志檔案和資料庫,這種恢複删除檔案的方法非常有用。

可以列出被程序所打開的檔案的資訊。被打開的檔案可以是

1.普通的檔案,2.目錄  3.網絡檔案系統的檔案,4.字元裝置檔案  5.(函數)共享庫  6.管道,命名管道 7.符号連結

8.底層的socket字流,網絡socket,unix域名socket

9.在linux裡面,大部分的東西都是被當做檔案的…..還有其他很多

怎樣使用lsof

這裡主要用案例的形式來介紹lsof 指令的使用

1.列出所有打開的檔案:

lsof

備注: 如果不加任何參數,就會打開所有被打開的檔案,建議加上一下參數來具體定位

2. 檢視誰正在使用某個檔案

lsof   /filepath/file

3.遞歸檢視某個目錄的檔案資訊

lsof +D /filepath/filepath2/

備注: 使用了+D,對應目錄下的所有子目錄和檔案都會被列出

4. 比使用+D選項,周遊檢視某個目錄的所有檔案資訊 的方法

lsof | grep ‘/filepath/filepath2/’

5. 列出某個使用者打開的檔案資訊

lsof  -u username

備注: -u 選項,u其實是user的縮寫

6. 列出某個程式所打開的檔案資訊

lsof -c mysql

備注: -c 選項将會列出所有以mysql開頭的程式的檔案,其實你也可以寫成lsof | grep mysql,但是第一種方法明顯比第二種方法要少打幾個字元了

7. 列出多個程式多打開的檔案資訊

lsof -c mysql -c apache

8. 列出某個使用者以及某個程式所打開的檔案資訊

lsof -u test -c mysql

9. 列出除了某個使用者外的被打開的檔案資訊

lsof   -u ^root

備注:^這個符号在使用者名之前,将會把是root使用者打開的程序不讓顯示

10. 通過某個程序号顯示該進行打開的檔案

lsof -p 1

11. 列出多個程序号對應的檔案資訊

lsof -p 123,456,789

12. 列出除了某個程序号,其他程序号所打開的檔案資訊

lsof -p ^1

13 . 列出所有的網絡連接配接

lsof -i

14. 列出所有tcp 網絡連接配接資訊

lsof  -i tcp

15. 列出所有udp網絡連接配接資訊

lsof  -i udp

16. 列出誰在使用某個端口

lsof -i :3306

17. 列出誰在使用某個特定的udp端口

lsof -i udp:55

特定的tcp端口

lsof -i tcp:80

18. 列出某個使用者的所有活躍的網絡端口

lsof  -a -u test -i

19. 列出所有網絡檔案系統

lsof -N

20.域名socket檔案

lsof -u

21.某個使用者組所打開的檔案資訊

lsof -g 5555

22. 根據檔案描述列出對應的檔案資訊

lsof -d description(like 2)

23. 根據檔案描述範圍列出檔案資訊

lsof -d 2-3

實用指令

linux lsof指令詳解
linux lsof指令詳解
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 [email protected]:ftp -r //不斷檢視目前ftp連接配接的情況(-r,lsof會永遠不斷的執行,直到收到中斷信号,+r,lsof會一直執行,直到沒有檔案被顯示,預設是15s重新整理) lsof -i [email protected]:ftp -n //lsof -n 不将IP轉換為hostname,預設是不加上-n參數      
linux lsof指令詳解
linux lsof指令詳解

參考:linux lsof指令詳解

linux lsof指令詳解
linux lsof指令詳解
COMMAND     PID        USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME init          1        root  cwd       DIR                8,1     4096          2 / init          1        root  rtd       DIR                8,1     4096          2 / init          1        root  txt       REG                8,1   150584     654127 /sbin/init udevd       415        root    0u      CHR                1,3      0t0       6254 /dev/null udevd       415        root    1u      CHR                1,3      0t0       6254 /dev/null udevd       415        root    2u      CHR                1,3      0t0       6254 /dev/null udevd       690        root  mem       REG                8,1    51736     302589 /lib/x86_64-linux-gnu/libnss_files-2.13.so syslogd    1246      syslog    2w      REG                8,1    10187     245418 /var/log/auth.log syslogd    1246      syslog    3w      REG                8,1    10118     245342 /var/log/syslog dd         1271        root    0r      REG                0,3        0 4026532038 /proc/kmsg dd         1271        root    1w     FIFO               0,15      0t0        409 /run/klogd/kmsg dd         1271        root    2u      CHR                1,3      0t0       6254 /dev/null      
linux lsof指令詳解
linux lsof指令詳解

linux lsof指令詳解
lsof abc.txt 顯示開啟檔案abc.txt的程序 lsof -c abc 顯示abc程序現在打開的檔案 lsof -c -p 1234 列出程序号為1234的程序所打開的檔案 lsof -g gid 顯示歸屬gid的程序情況 lsof +d /usr/local/ 顯示目錄下被程序開啟的檔案 lsof +D /usr/local/ 同上,但是會搜尋目錄下的目錄,時間較長 lsof -d 4 顯示使用fd為4的程序 lsof -i 用以顯示符合條件的程序情況 lsof -i[46] [protocol][@hostname|hostaddr][:service|port]   46 --> IPv4 or IPv6   protocol --> TCP or UDP   hostname --> Internet host name   hostaddr --> IPv4位址   service --> /etc/service中的 service name (可以不止一個)   port --> 端口号 (可以不止一個)      
linux lsof指令詳解

linux lsof指令詳解
linux lsof指令詳解
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 [email protected]:ftp -r //不斷檢視目前ftp連接配接的情況(-r,lsof會永遠不斷的執行,直到收到中斷信号,+r,lsof會一直執行,直到沒有檔案被顯示,預設是15s重新整理) lsof -i [email protected]:ftp -n //lsof -n 不将IP轉換為hostname,預設是不加上-n參數      
linux lsof指令詳解
linux lsof指令詳解