Linux命令分享:lsof命令,linux命令分享lsof
lsof(listopenfiles)是一個列出當前系統開啟檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連接和硬體。所以如傳輸控制通訊協定(TCP)和使用者資料包通訊協定(UDP)通訊端等,系統在後台都為該應用程式分配了一個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用介面。因為應用程式開啟檔案的描述符列表提供了大量關於這個應用程式本身的資訊,因此通過lsof工具能夠查看這個列表對系統監測以及排錯將是很有協助的。
1.命令格式:
lsof[參數][檔案]
2.命令功能:
用於查看你進程開打的檔案,開啟檔案的進程,進程開啟的連接埠(TCP、UDP)。找回/恢複刪除的檔案。是十分方便的系統監視工具,因為lsof需要訪問核心記憶體和各種檔案,所以需要root使用者執行。
lsof開啟的檔案可以是:
1.普通檔案
2.目錄
3.網路檔案系統的檔案
4.字元或裝置檔案
5.(函數)共用庫
6.管道,具名管道
7.符號連結
8.網路檔案(例如:NFSfile、網路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
COMMANDPIDUSERFDTYPEDEVICESIZENODENAME
init1rootcwdDIR8,240962/
init1rootrtdDIR8,240962/
init1roottxtREG8,2434966121706/sbin/init
init1rootmemREG8,21436007823908/lib64/ld-2.5.so
init1rootmemREG8,217223047823915/lib64/libc-2.5.so
init1rootmemREG8,2233607823919/lib64/libdl-2.5.so
init1rootmemREG8,2954647824116/lib64/libselinux.so.1
init1rootmemREG8,22474967823947/lib64/libsepol.so.1
init1root10uFIFO0,171233/dev/initctl
migration2rootcwdDIR8,240962/
migration2rootrtdDIR8,240962/
migration2roottxtunknown/proc/2/exe
ksoftirqd3rootcwdDIR8,240962/
ksoftirqd3rootrtdDIR8,240962/
ksoftirqd3roottxtunknown/proc/3/exe
migration4rootcwdDIR8,240962/
migration4rootrtdDIR8,240962/
migration4roottxtunknown/proc/4/exe
ksoftirqd5rootcwdDIR8,240962/
ksoftirqd5rootrtdDIR8,240962/
ksoftirqd5roottxtunknown/proc/5/exe
events/06rootcwdDIR8,240962/
events/06rootrtdDIR8,240962/
events/06roottxtunknown/proc/6/exe
events/17rootcwdDIR8,240962/
說明:
lsof輸出各列資訊的意義如下:
COMMAND:進程的名稱
PID:進程標識符
PPID:父進程標識符(需要指定-R參數)
USER:進程所有者
PGID:進程所屬組
FD:檔案描述符,應用程式通過檔案描述符識別該檔案。如cwd、txt等
(1)cwd:表示currentworkdirctory,即:應用程式的當前工作目錄,這是該應用程式啟動的目錄,除非它本身對這個目錄變更
(2)txt:該類型的檔案是程式碼,如應用程式二進位檔案本身或共用庫,如上列表中顯示的/sbin/init程式
(3)lnn:libraryreferences(AIX);
(4)er:FDinformationerror(seeNAMEcolumn);
(5)jld:jaildirectory(FreeBSD);
(6)ltx:sharedlibrarytext(codeanddata);
(7)mxx:hexmemory-mappedtypenumberxx.
(8)m86:DOSMergemappedfile;
(9)mem:memory-mappedfile;
(10)mmap:memory-mappeddevice;
(11)pd:parentdirectory;
(12)rtd:rootdirectory;
(13)tr:kerneltracefile(OpenBSD);
(14)v86VP/ixmappedfile;
(15)0:表示標準輸出
(16)1:表示標準輸入
(17)2:表示標準錯誤
一般在標準輸出、標準錯誤、標準輸入後還跟著檔案狀態模式:r、w、u等
(1)u:表示該檔案被開啟並處於讀取/寫入模式
(2)r:表示該檔案被開啟並處於唯讀模式
(3)w:表示該檔案被開啟並處於
(4)空格:表示該檔案的狀態模式為unknow,且沒有鎖定
(5)-:表示該檔案的狀態模式為unknow,且被鎖定
同時在檔案狀態模式後面,還跟著相關的鎖
(1)N:foraSolarisNFSlockofunknowntype;
(2)r:forreadlockonpartofthefile;
(3)R:forareadlockontheentirefile;
(4)w:forawritelockonpartofthefile;(檔案的部分寫鎖)
(5)W:forawritelockontheentirefile;(整個檔案的寫鎖)
(6)u:forareadandwritelockofanylength;
(7)U:foralockofunknowntype;
(8)x:foranSCOOpenServerXenixlockonpartofthefile;
(9)X:foranSCOOpenServerXenixlockontheentirefile;
(10)space:ifthereisnolock.
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
COMMANDPIDUSERFDTYPEDEVICESIZENODENAME
bash24159roottxtREG8,28015285368780/bin/bash
bash24909roottxtREG8,28015285368780/bin/bash
bash24941roottxtREG8,28015285368780/bin/bash
[root@localhost~]#
說明:
執行個體3:遞迴查看某個目錄的檔案資訊
命令:
lsoftest/test3
輸出:
[root@localhost~]#cd/opt/soft/
[root@localhostsoft]#lsoftest/test3
COMMANDPIDUSERFDTYPEDEVICESIZENODENAME
bash24941rootcwdDIR8,240962258872test/test3
vi24976rootcwdDIR8,240962258872test/test3
[root@localhostsoft]#
說明:
使用了+D,對應目錄下的所有子目錄和檔案都會被列出
執行個體4:不使用+D選項,遍曆查看某個目錄的所有檔案資訊的方法
命令:
lsof|grep‘test/test3’
輸出:
[root@localhostsoft]#lsof|grep‘test/test3’
bash24941rootcwdDIR8,240962258872/opt/soft/test/test3
vi24976rootcwdDIR8,240962258872/opt/soft/test/test3
vi24976root4uREG8,2122882258882/opt/soft/test/test3/.log2013.log.swp
[root@localhostsoft]#
說明:
執行個體5:列出某個使用者開啟的檔案資訊
命令:
lsof-uusername
說明:
-u選項,u其實是user的縮寫
執行個體6:列出某個程式進程所開啟的檔案資訊
命令:
lsof-cmysql
說明:
-c選項將會列出所有以mysql這個進程開頭的程式的檔案,其實你也可以寫成lsof|grepmysql,但是第一種方法明顯比第二種方法要少打幾個字元了
執行個體7:列出多個進程多個開啟的檔案資訊
命令:
lsof-cmysql-capache
執行個體8:列出某個使用者以及某個進程所開啟的檔案資訊
命令:
lsof-utest-cmysql
說明:
使用者與進程可相關,也可以不相關
執行個體9:列出除了某個使用者外的被開啟的檔案資訊
命令:
lsof-u^root
說明:
^這個符號在使用者名稱之前,將會把是root使用者開啟的進程不讓顯示
執行個體10:通過某個進程號顯示該進行開啟的檔案
命令:
lsof-p1
執行個體11:列出多個進程號對應的檔案資訊
命令:
lsof-p1,2,3
執行個體12:列出除了某個進程號,其他進程號所開啟的檔案資訊
命令:
lsof-p^1
執行個體13:列出所有的網路連接
命令:
lsof-i
執行個體14:列出所有tcp網路連接資訊
命令:
lsof-itcp
執行個體15:列出所有udp網路連接資訊
命令:
lsof-iudp
執行個體16:列出誰在使用某個連接埠
命令:
lsof-i:3306
執行個體17:列出誰在使用某個特定的udp連接埠
命令:
lsof-iudp:55
或者:特定的tcp連接埠
命令:
lsof-itcp:80
執行個體18:列出某個使用者的所有活躍的網路連接埠
命令:
lsof-a-utest-i
執行個體19:列出所有網路檔案系統
命令:
lsof-N
執行個體20:網域名稱socket檔案
命令:
lsof-u
執行個體21:某個使用者組所開啟的檔案資訊
命令:
lsof-g5555
執行個體22:根據檔案描述列出對應的檔案資訊
命令:
lsof-ddescription(like2)
例如:lsof-dtxt
例如:lsof-d1
例如:lsof-d2
說明:
0表示標準輸入,1表示標準輸出,2表示標準錯誤,從而可知:所以大多數應用程式所開啟的檔案的FD都是從3開始
執行個體23:根據檔案描述範圍列出檔案資訊
命令:
lsof-d2-3
執行個體24:列出COMMAND列中包含字串”sshd“,且檔案描符的類型為txt的檔案資訊
命令:
lsof-csshd-a-dtxt
輸出:
[root@localhostsoft]#lsof-csshd-a-dtxt
COMMANDPIDUSERFDTYPEDEVICESIZENODENAME
sshd2756roottxtREG8,24094881027867/usr/sbin/sshd
sshd24155roottxtREG8,24094881027867/usr/sbin/sshd
sshd24905roottxtREG8,24094881027867/usr/sbin/sshd
sshd24937roottxtREG8,24094881027867/usr/sbin/sshd
[root@localhostsoft]#
[root@localhostsoft]#
執行個體25:列出被進程號為1234的進程所開啟的所有IPV4networkfiles
命令:
lsof-i4-a-p1234
執行個體26:列出目前串連主機peida.linux上連接埠為:20,21,22,25,53,80相關的所有檔案資訊,且每隔3秒不斷的執行lsof指令
命令:
lsof-i@peida.linux:20,21,22,25,53,80-r3