2013年10月2日 星期三

每天一個Linux指令- lsof指令(列出當前系統打開 檔案/網路埠/硬體設備 工具)

每天一個Linux指令- lsof指令(列出當前系統打開 檔案/網路埠/硬體設備 工具)



拷貝來源:


01.http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html


02.http://www.cnblogs.com/peida/archive/2013/02/26/2932972.html


lsof(list open files)是一個列出當前系統打開檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連接和硬體。所以如傳輸控制協議 (TCP) 和用戶資料報協定 (UDP) 套接字等,系統在後臺都為該應用程式分配了一個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的交互提供了通用介面。因為應用程式打開檔案的描述符列表提供了大量關於這個應用程式本身的資訊,因此通過lsof工具能夠查看這個列表對系統監測以及排錯將是很有幫助的。


1命令格式:


lsof [參數][文件]


2命令功能:


用於查看你進程開打的檔案,打開檔案的進程,進程打開的埠(TCP、UDP)。找回/恢復刪除的檔案。是十分方便的系統監視工具,因為 lsof 需要訪問核心記憶體和各種檔案,所以需要root用戶執行


lsof打開的檔案可以是:


1.普通檔案


2.目錄


3.網路檔案系統的檔案


4.字元或設備檔案


5.(函數)共用庫


6.管道,具名管道


7.符號鏈結


8.網路檔案(例如:NFS file、網路socket,unix功能變數名稱socket)


9.還有其他類型的文件,等等


3命令參數:


-a 列出打開檔案存在的進程


-c<進程名> 列出指定進程所打開的檔案


-g  列出GID號進程詳情


-d<檔案號> 列出佔用該檔案號的進程


+d<目錄>  列出目錄下被打開的檔案


+D<目錄>  遞迴列出目錄下被打開的檔案


-n<目錄>  列出使用NFS的檔案


-i<條件>  列出符合條件的進程。(4、6、協議、:埠、 @ip )


-p<進程號> 列出指定進程號所打開的檔案


-u  列出UID號進程詳情


-h 顯示幫助資訊


-v 顯示版本資訊


4使用實例:


實例1:無任何參數


命令:lsof


輸出:


   [root@localhost ~]# lsof


 


COMMAND     PID USER   FD      TYPE             DEVICE     SIZE       NODE NAME
init          1 root  cwd       DIR                8,2     4096          2 /
init          1 root  rtd       DIR                8,2     4096          2 /
init          1 root  txt       REG                8,2    43496    6121706 /sbin/init
init          1 root  mem       REG                8,2   143600    7823908 /lib64/ld-2.5.so
init          1 root  mem       REG                8,2  1722304    7823915 /lib64/libc-2.5.so
init          1 root  mem       REG                8,2    23360    7823919 /lib64/libdl-2.5.so
init          1 root  mem       REG                8,2    95464    7824116 /lib64/libselinux.so.1
init          1 root  mem       REG                8,2   247496    7823947 /lib64/libsepol.so.1
init          1 root   10u     FIFO               0,17                1233 /dev/initctl
migration     2 root  cwd       DIR                8,2     4096          2 /
migration     2 root  rtd       DIR                8,2     4096          2 /
migration     2 root  txt   unknown                                        /proc/2/exe
ksoftirqd     3 root  cwd       DIR                8,2     4096          2 /
ksoftirqd     3 root  rtd       DIR                8,2     4096          2 /
ksoftirqd     3 root  txt   unknown                                        /proc/3/exe
migration     4 root  cwd       DIR                8,2     4096          2 /
migration     4 root  rtd       DIR                8,2     4096          2 /
migration     4 root  txt   unknown                                        /proc/4/exe
ksoftirqd     5 root  cwd       DIR                8,2     4096          2 /
ksoftirqd     5 root  rtd       DIR                8,2     4096          2 /
ksoftirqd     5 root  txt   unknown                                        /proc/5/exe
events/0      6 root  cwd       DIR                8,2     4096          2 /
events/0      6 root  rtd       DIR                8,2     4096          2 /
events/0      6 root  txt   unknown                                        /proc/6/exe
events/1      7 root  cwd       DIR                8,2     4096          2 /


 


說明:


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


COMMAND:進程的名稱


PID:進程識別字


PPID:父進程識別字(需要指定-R參數)


USER:進程所有者


PGID:進程所屬組


FD:檔案描述符,應用程式通過檔案描述符識別該檔案。如cwd、txt等


(1)cwd:表示current work dirctory,即:應用程式的當前工作目錄,這是該應用程式啟動的目錄,除非它本身對這個目錄進行更改


(2)txt :該類型的檔案是程式碼,如應用程式二進位檔案本身或共用庫,如上列表中顯示的 /sbin/init 程式


(3)lnn:library references (AIX);


(4)er:FD information error (see NAME column);


(5)jld:jail directory (FreeBSD);


(6)ltx:shared library text (code and data);


(7)mxx :hex memory-mapped type number xx.


(8)m86:DOS Merge mapped file;


(9)mem:memory-mapped file;


(10)mmap:memory-mapped device;


(11)pd:parent directory;


(12)rtd:root directory;


(13)tr:kernel trace file (OpenBSD);


(14)v86  VP/ix mapped file;


(15)0:表示標準輸出


(16)1:表示標準輸入


(17)2:表示標準錯誤


一般在標準輸出、標準錯誤、標準輸入後還跟著檔案狀態模式:r、w、u等


(1)u:表示該檔案被打開並處於讀取/寫入模式


(2)r:表示該檔案被打開並處於唯讀模式


(3)w:表示該檔案被打開並處於


(4)空格:表示該檔案的狀態模式為unknow,且沒有鎖定


(5)-:表示該檔案的狀態模式為unknow,且被鎖定


同時在檔案狀態模式後面,還跟著相關的鎖


(1)N:for a Solaris NFS lock of unknown type;


(2)r:for read lock on part of the file;


(3)R:for a read lock on the entire file;


(4)w:for a write lock on part of the file;(檔案的部分寫鎖)


(5)W:for a write lock on the entire file;(整個文件的寫鎖)


(6)u:for a read and write lock of any length;


(7)U:for a lock of unknown type;


(8)x:for an SCO OpenServer Xenix lock on part      of the file;


(9)X:for an SCO OpenServer Xenix lock on the      entire file;


(10)space:if there is no lock.


TYPE:文件類型,如DIR、REG等,常見的文件類型


(1)DIR:表示目錄


(2)CHR:表示字元類型


(3)BLK:塊設備類型


(4)UNIX: UNIX 域套接字


(5)FIFO:先進先出 (FIFO) 佇列


(6)IPv4:網際協議 (IP) 套接字


DEVICE:指定磁片的名稱


SIZE:文件的大小


NODE:索引節點(檔案在磁片上的標識)


NAME:打開檔案的確切名稱


實例2:查看誰正在使用某個檔案,也就是說查找某個檔案相關的進程


命令:lsof /bin/bash


輸出:


 


[root@localhost ~]# lsof /bin/bash
COMMAND   PID USER  FD   TYPE DEVICE   SIZE    NODE NAME
bash    24159 root txt    REG    8,2 801528 5368780 /bin/bash
bash    24909 root txt    REG    8,2 801528 5368780 /bin/bash
bash    24941 root txt    REG    8,2 801528 5368780 /bin/bash
[root@localhost ~]


 


 


說明:


實例3:遞迴查看某個目錄的檔案資訊


命令:lsof test/test3


輸出:


 


[root@localhost ~]# cd /opt/soft/
[root@localhost soft]# lsof test/test3
COMMAND   PID USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    24941 root  cwd    DIR    8,2 4096 2258872 test/test3
vi      24976 root  cwd    DIR    8,2 4096 2258872 test/test3
[root@localhost soft]


 


 


說明:


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


實例4:不使用+D選項,遍曆查看某個目錄的所有檔案資訊的方法


命令:lsof |grep 'test/test3'


輸出:


[root@localhost soft]# lsof |grep 'test/test3'


bash      24941 root  cwd       DIR                8,2     4096    2258872 /opt/soft/test/test3
vi        24976 root  cwd       DIR                8,2     4096    2258872 /opt/soft/test/test3
vi        24976 root    4u      REG                8,2    12288    2258882 /opt/soft/test/test3/.log2013.log.swp
[root@localhost soft]


說明:


實例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 1,2,3


實例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)


例如:lsof  -d  txt


例如:lsof  -d  1


例如:lsof  -d  2


說明:


0表示標準輸入,1表示標準輸出,2表示標準錯誤,從而可知:所以大多數應用程式所打開的檔案的 FD 都是從 3 開始


實例23:根據檔案描述範圍列出檔案資訊


命令:lsof -d 2-3


實例24:列出COMMAND列中包含字串" sshd",且檔案描符的類型為txt的檔案資訊


命令:lsof -c sshd -a -d txt


輸出:


 


[root@localhost soft]# lsof -c sshd -a -d txt
COMMAND   PID USER  FD   TYPE DEVICE   SIZE    NODE NAME
sshd     2756 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24155 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24905 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24937 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
[root@localhost soft]

[root@localhost soft]


 


實例25:列出被進程號為1234的進程所打開的所有IPV4 network files 


命令lsof -i 4 -a -p 1234


實例26:列出目前連接主機peida.linux上埠為:20,21,22,25,53,80相關的所有檔案資訊,且每隔3秒不斷的執行lsof指令


命令:


lsof -i @peida.linux:20,21,22,25,53,80  -r  3


沒有留言:

張貼留言