天天看點

linux之lsof詳解

作者:新一代農名工

lsof指令介紹:

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

lsof選項:

lsof 幾個重要的參數:
-a:        列出打開檔案存在的程序(結果進行“與”運算)
-c<程序名>	列出指定程序所打開的檔案;
-g	        列出GID号程序詳情;
-d<檔案号>	列出占用該檔案号的程序;
+d<目錄>	列出目錄下被打開的檔案;
+D<目錄>	遞歸列出目錄下被打開的檔案;
-n<目錄>	列出使用NFS的檔案;
-i<條件>	列出符合條件的程序。(4、6、協定、:端口、 @ip )
-p<程序号>	列出指定程序号所打開的檔案;
-u	        列出UID号程序詳情;
-h	        顯示幫助資訊;
-v	       顯示版本資訊。           

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

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

lsof用法:

lsof test.txt 顯示開啟檔案test.txt的程序
lsof -c abc 顯示abc程序現在打開的檔案
lsof -cp 1234 列出程序号為1234的程序所打開的檔案
lsof -g gid 顯示歸屬gid的程序情況
lsof +d /usr/local/ 顯示/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 --> 端口号 (可以不止一個)
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             //列出程序id為30297的程序所打開的檔案
lsof -D /tmp              //顯示所有在/tmp目錄下打開檔案的程序
 
lsof -u1000               //檢視uid是1000的使用者的程序的檔案使用情況
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參數           

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
           

lsof案例:

場景:檔案被删除後,但磁盤空間并沒有被釋放。
1,檢視目前被删除的檔案
lsof -n | grep "delete"
2, kill掉對應程序           

繼續閱讀