每天一個linux命令(ling)(51):lsof命令(ling)
lsof(list open files)是(shi)一(yi)個(ge)列(lie)(lie)出當前系統(tong)(tong)打(da)開文(wen)件(jian)的(de)(de)(de)工具。在(zai)linux環境下,任何(he)(he)事(shi)物都以文(wen)件(jian)的(de)(de)(de)形式存在(zai),通過(guo)文(wen)件(jian)不僅僅可以訪(fang)問常規(gui)數(shu)據(ju)(ju),還可以訪(fang)問網絡(luo)連接和(he)硬件(jian)。所以如傳輸(shu)控制協(xie)議 (TCP) 和(he)用戶數(shu)據(ju)(ju)報協(xie)議 (UDP) 套接字等,系統(tong)(tong)在(zai)后(hou)臺都為該(gai)應(ying)用程序分配(pei)了一(yi)個(ge)文(wen)件(jian)描述符,無論這個(ge)文(wen)件(jian)的(de)(de)(de)本質(zhi)如何(he)(he),該(gai)文(wen)件(jian)描述符為應(ying)用程序與基礎操作系統(tong)(tong)之間的(de)(de)(de)交互提(ti)供了通用接口(kou)。因為應(ying)用程序打(da)開文(wen)件(jian)的(de)(de)(de)描述符列(lie)(lie)表提(ti)供了大(da)量關(guan)于這個(ge)應(ying)用程序本身的(de)(de)(de)信息(xi),因此(ci)通過(guo)lsof工具能(neng)夠查看這個(ge)列(lie)(lie)表對系統(tong)(tong)監測(ce)以及排(pai)錯將是(shi)很(hen)有幫(bang)助的(de)(de)(de)。
1.命令格式:
lsof [參數][文件]
2.命令功能:
用于查看你進(jin)(jin)程(cheng)(cheng)開(kai)(kai)(kai)打的文件(jian),打開(kai)(kai)(kai)文件(jian)的進(jin)(jin)程(cheng)(cheng),進(jin)(jin)程(cheng)(cheng)打開(kai)(kai)(kai)的端口(TCP、UDP)。找回/恢復刪除的文件(jian)。是十(shi)分方便的系統監視(shi)工具,因為 lsof 需(xu)要訪問核心內(nei)存和各種文件(jian),所以需(xu)要root用戶執(zhi)行。
lsof打開的文件可以是(shi):
1.普通文件
2.目錄
3.網(wang)絡(luo)文件系統的文件
4.字符或(huo)設備(bei)文件
5.(函(han)數)共(gong)享庫
6.管(guan)(guan)道(dao)(dao),命名管(guan)(guan)道(dao)(dao)
7.符號(hao)鏈(lian)接
8.網絡(luo)文件(例如(ru):NFS file、網絡(luo)socket,unix域名socket)
9.還有其它類型的文件,等等
3.命(ming)令參(can)數:
-a 列出打(da)開文件存在的(de)進程
-c<進程名> 列(lie)出指定進程所打開(kai)的文件
-g 列出GID號進(jin)程詳(xiang)情
-d<文件號> 列出占用該文件號的進程(cheng)
+d<目錄> 列出目錄下被打開的文件
+D<目(mu)錄(lu)(lu)> 遞(di)歸列出目(mu)錄(lu)(lu)下被打開(kai)的文件
-n<目(mu)錄> 列出使用(yong)NFS的(de)文(wen)件
-i<條(tiao)件(jian)> 列出符合(he)條(tiao)件(jian)的進程。(4、6、協議、:端(duan)口、 @ip )
-p<進程(cheng)號> 列出指定進程(cheng)號所打(da)開的(de)文件
-u 列出UID號進程詳情
-h 顯(xian)示幫(bang)助信息
-v 顯示版(ban)本信息
4.使用實(shi)例:
實例1:無(wu)任何(he)參(can)數
命令:
lsof
輸出:
[root@localhost ~]# lsof
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輸出各列信息的意(yi)義如(ru)下:
COMMAND:進程的名稱
PID:進程標識符
PPID:父進程標識符(fu)(需要(yao)指(zhi)定-R參數)
USER:進程(cheng)所有者
PGID:進程所屬組
FD:文件描(miao)(miao)述符,應用程(cheng)序通過(guo)文件描(miao)(miao)述符識(shi)別該文件。如cwd、txt等(deng)
(1)cwd:表示current work dirctory,即:應用(yong)程序的當前工作目(mu)錄,這(zhe)是該應用(yong)程序啟動的目(mu)錄,除(chu)非(fei)它本身(shen)對這(zhe)個(ge)目(mu)錄進行更改
(2)txt :該類型的(de)文(wen)件(jian)是程序代碼,如(ru)應用程序二進制文(wen)件(jian)本身或(huo)共享庫,如(ru)上列(lie)表中顯示的(de) /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:表示(shi)標準輸(shu)出(chu)
(16)1:表示標準(zhun)輸入
(17)2:表示標準錯(cuo)誤
一般在標(biao)準(zhun)(zhun)輸(shu)出、標(biao)準(zhun)(zhun)錯誤、標(biao)準(zhun)(zhun)輸(shu)入后(hou)還跟著文(wen)件狀(zhuang)態模(mo)式:r、w、u等
(1)u:表示該文件被打(da)開并處于讀(du)取/寫入模式
(2)r:表示該文件(jian)被打開并(bing)處(chu)于只(zhi)讀模式(shi)
(3)w:表示(shi)該文件(jian)被打(da)開并處于
(4)空格:表示(shi)該文件的狀態(tai)模式為unknow,且沒有鎖定
(5)-:表示該文件的狀(zhuang)態模式為unknow,且被鎖定(ding)
同時在文件狀態模式后面,還跟著相關(guan)的鎖(suo)
(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;(文(wen)件的部分寫鎖(suo))
(5)W:for a write lock on the entire file;(整個(ge)文件的寫鎖)
(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:文(wen)件類型,如DIR、REG等(deng),常見(jian)的文(wen)件類型
(1)DIR:表(biao)示(shi)目錄
(2)CHR:表示字符(fu)類(lei)型(xing)
(3)BLK:塊設備類(lei)型
(4)UNIX: UNIX 域(yu)套接字
(5)FIFO:先(xian)進先(xian)出(chu) (FIFO) 隊列
(6)IPv4:網際協議 (IP) 套接字(zi)
DEVICE:指定磁盤的名(ming)稱
SIZE:文件的大小
NODE:索引節點(文件在磁盤上的(de)標識)
NAME:打開文件的確切(qie)名稱
實(shi)例2:查看誰正在(zai)使用某(mou)個(ge)(ge)文(wen)件,也就是說查找某(mou)個(ge)(ge)文(wen)件相關的進程
命令:
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:遞歸查看某個目錄的文(wen)件信息
命令(ling):
lsof test/test3
輸出:
[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,對應(ying)目(mu)錄下(xia)的所有(you)子目(mu)錄和文件都會被列出(chu)
實例4:不使用+D選(xuan)項,遍歷查看某個(ge)目錄(lu)的(de)所有(you)文(wen)件信息的(de)方法(fa)
命(ming)令(ling):
lsof |grep 'test/test3'
輸(shu)出:
[root@localhost soft]# lsof |grep '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]#
說(shuo)明:
實例5:列出某個(ge)用戶打(da)開的文件(jian)信(xin)息(xi)
命令(ling):
lsof -u username
說明(ming):
-u 選項(xiang),u其實是(shi)user的縮(suo)寫
實例6:列出某(mou)個程(cheng)序(xu)進程(cheng)所打(da)開的文件信息
命令:
lsof -c mysql
說明:
-c 選項將會列(lie)出所有以(yi)mysql這個進程開頭的程序(xu)的文件(jian),其實(shi)你也可(ke)以(yi)寫成 lsof | grep mysql, 但(dan)是第(di)一種方(fang)法(fa)明顯比第(di)二(er)種方(fang)法(fa)要(yao)少打幾個字符了
實例7:列(lie)出多(duo)個進程(cheng)多(duo)個打開的文件信(xin)息
命令:
lsof -c mysql -c apache
實例8:列出某(mou)個(ge)用戶以及某(mou)個(ge)進程所打開的文件信息
命令(ling):
lsof -u test -c mysql
說明:
用戶與進程(cheng)可(ke)相(xiang)關,也(ye)可(ke)以(yi)不相(xiang)關
實例9:列出除(chu)了某個用戶外的(de)被打(da)開的(de)文件信息(xi)
命令:
lsof -u ^root
說明:
^這個(ge)符(fu)號在用(yong)戶(hu)名之前,將會把(ba)是root用(yong)戶(hu)打(da)開的進程不讓顯示
實例(li)10:通過某個進程號顯示該進行打開(kai)的文件
命(ming)令:
lsof -p 1
實例11:列出(chu)多(duo)個進(jin)程號對應(ying)的文件信(xin)息
命令(ling):
lsof -p 1,2,3
實(shi)例12:列出除了某個進程號(hao),其他進程號(hao)所打開的(de)文件信息
命令:
lsof -p ^1
實例13:列出(chu)所(suo)有的網絡(luo)連接(jie)
命令:
lsof -i
實例14:列出(chu)所有tcp 網絡連接信息
命(ming)令:
lsof -i tcp
實例15:列(lie)出(chu)所有udp網絡連接信(xin)息(xi)
命令:
lsof -i udp
實例(li)16:列出誰(shui)在使用某(mou)個端口(kou)
命令:
lsof -i :3306
實例17:列出誰在使(shi)用某(mou)個特定的udp端口(kou)
命令(ling):
lsof -i udp:55
或者(zhe):特定的tcp端(duan)口(kou)
命令:
lsof -i tcp:80
實例18:列出某個用戶(hu)的所(suo)有活(huo)躍的網絡端(duan)口
命令:
lsof -a -u test -i
實(shi)例19:列出所有網(wang)絡文(wen)件系統(tong)
命令(ling):
lsof -N
實例20:域(yu)名socket文件(jian)
命令:
lsof -u
實例21:某(mou)個用戶(hu)組所打開的(de)文件信息
命(ming)令:
lsof -g 5555
實例22:根據文(wen)件描述列(lie)出對應的文(wen)件信息
命令:
lsof -d description(like 2)
例如:lsof -d txt
例如:lsof -d 1
例(li)如(ru):lsof -d 2
說明:
0表(biao)示標(biao)準(zhun)輸(shu)入,1表(biao)示標(biao)準(zhun)輸(shu)出,2表(biao)示標(biao)準(zhun)錯誤(wu),從而可知:所以大多數應用程序所打開的文件(jian)的 FD 都(dou)是(shi)從 3 開始
實例23:根據文件描述范(fan)圍列(lie)出文件信息
命令:
lsof -d 2-3
實例(li)24:列出(chu)COMMAND列中包(bao)含(han)字符串" sshd",且文件描符(fu)的(de)類(lei)型(xing)為txt的(de)文件信(xin)息
命令:
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:列出被進(jin)程號為1234的進(jin)程所打開的所有IPV4 network files
命令(ling):
lsof -i 4 -a -p 1234
實例26:列出目前連接主機(ji)peida.linux上端口為:20,21,22,25,53,80相關的所有文(wen)件(jian)信息,且(qie)每隔3秒不斷的執(zhi)行lsof指令
命令:
lsof -i @peida.linux:20,21,22,25,53,80 -r 3
關注 熵減黑客 ,一起學習成長
