lsof 命令用法詳解


lsof 命令用法詳解


作用

  用於查看你進程開打的文件,打開文件的進程,進程打開的端口(TCP、UDP)。找回/恢復刪除的文件。是十分方便的系統監視工具,因為lsof命令需要訪問核心內存和各種文件,所以需要root用戶執行

原理介紹

  在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。所以如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在后台都為該應用程序分配了一個文件描述符,無論這個文件的本質如何,該文件描述符為應用程序與基礎操作系統之間的交互提供了通用接口。因為應用程序打開文件的描述符列表提供了大量關於這個應用程序本身的信息,因此通過lsof工具能夠查看這個列表對系統監測以及排錯將是很有幫助的。

語法

lsof (選項)

選項

-a:列出打開文件存在的進程;
-c<進程名>:列出指定進程所打開的文件;
-g:列出GID號進程詳情;
-d<文件號>:列出占用該文件號的進程;
+d<目錄>:列出目錄下被打開的文件;
+D<目錄>:遞歸列出目錄下被打開的文件;
-n<目錄>:列出使用NFS的文件;
-i<條件>:列出符合條件的進程。(4、6、協議、:端口、 @ip )
-p<進程號>:列出指定進程號所打開的文件;
-u:列出UID號進程詳情;
-h:顯示幫助信息;
-v:顯示版本信息。

實例

例1、lsof 不帶任何參數運行lsof會列出所有進程打開的所有文件。

lsof輸出各列信息的意義如下:

COMMAND:進程的名稱
PID:進程標識符
PPID:父進程標識符(需要指定-R參數)
USER:進程所有者
PGID:進程所屬組
FD:文件描述符,應用程序通過文件描述符識別該文件。

文件描述符列表:

cwd:表示current work dirctory,即:應用程序的當前工作目錄,這是該應用程序啟動的目錄,除非它本身對這個目錄進行更改
txt:該類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序
lnn:library references (AIX);
er:FD information error (see NAME column);
jld:jail directory (FreeBSD);
ltx:shared library text (code and data);
mxx :hex memory-mapped type number xx.
m86:DOS Merge mapped file;
mem:memory-mapped file;
mmap:memory-mapped device;
pd:parent directory;
rtd:root directory;
tr:kernel trace file (OpenBSD);
v86 VP/ix mapped file;
0:表示標准輸出
1:表示標准輸入
2:表示標准錯誤

一般在標准輸出、標准錯誤、標准輸入后還跟着文件狀態模式:

u:表示該文件被打開並處於讀取/寫入模式。
r:表示該文件被打開並處於只讀模式。
w:表示該文件被打開並處於。
空格:表示該文件的狀態模式為unknow,且沒有鎖定。
-:表示該文件的狀態模式為unknow,且被鎖定。

同時在文件狀態模式后面,還跟着相關的鎖:
N:for a Solaris NFS lock of unknown type;
r:for read lock on part of the file;
R:for a read lock on the entire file;
w:for a write lock on part of the file;(文件的部分寫鎖)
W:for a write lock on the entire file;(整個文件的寫鎖)
u:for a read and write lock of any length;
U:for a lock of unknown type;
x:for an SCO OpenServer Xenix lock on part of the file;
X:for an SCO OpenServer Xenix lock on the entire file;
space:if there is no lock.

文件類型:

DIR:表示目錄。
CHR:表示字符類型。
BLK:塊設備類型。
UNIX: UNIX 域套接字。
FIFO:先進先出 (FIFO) 隊列。
IPv4:網際協議 (IP) 套接字。
DEVICE:指定磁盤的名稱
SIZE:文件的大小
NODE:索引節點(文件在磁盤上的標識)
NAME:打開文件的確切名稱

常用總結


1. 找出誰在使用某個文件

 # lsof /path/to/file

只需要執行文件的路徑,lsof就會列出所有使用這個文件的進程,你也可以列出多個文件,lsof會列出所有使用這些文件的進程。

你也可以一次制定多個文件:

 # lsof /path/to/file1 /path/to/file2

2. 遞歸查找某個目錄中所有打開的文件

 # lsof +D /usr/bin

加上+D參數,lsof會對指定目錄進行遞歸查找,注意這個參數要比grep版本慢

 # lsof | grep ‘/usr/lib’

之所以慢是因為+D首先查找所有的文件,然后一次性輸出。


3.列出某個用戶打開的所有文件

 # lsof -u pkrumins

-u選項限定只列出所有被用戶pkrumins打開的文件,你可以通過逗號指定多個用戶:

 # lsof -u rms,root

這條命令會列出所有rms和root用戶打開的文件。

你也可以像下面這樣使用多個-u做同樣的事情:

 # lsof -u rms -u root

4.查找某個程序打開的所有文件

 # lsof -c apache


-c選項限定只列出以apache開頭的進程打開的文件:

所以你可以不用像下面這樣寫:

 # lsof | grep foo

而使用下面這個更簡短的版本:

 # lsof -c foo

事實上,你可以只制定進程名稱的開頭:

 # lsof -c apa

這會列出所有以apa開頭的進程打開的文件

你同樣可以制定多個-c參數:

 # lsof -c apache -c python

這會列出所有由apache和python打開的文件


5.列出所有由某個用戶某個進程打開的文件(組合)

# lsof -u pkrumins -c apache

你也可以組合使用多個選項,這些選項默認進行或關聯,也就是說上面的命令會輸入由pkrumins用戶或是apache進程打開的文件。

列出所有由一個用戶-a選項表示 某個進程打開的文件

# lsof -a -u pkrumins -c bash

-a參數可以將多個選項的組合條件由或變為與,上面的命令會顯示所有由pkrumins用戶以及bash進程打開的文件。

列出除root用戶外的所有用戶打開的文件

# lsof -u ^root

注意root前面的^符號,它執行取反操作,因此lsof會列出所有root用戶之外的用戶打開的文件。


6.列出所有由某個PID對應的進程打開的文件

 # lsof -p 1

-p選項讓你可以使用進程id來過濾輸出。

記住你也可以用都好來分離多個pid

 # lsof -p 450,980,333

列出所有進程打開的文件除了某個pid的

 # lsof -p ^1

同前面的用戶一樣,你也可以對-p選項使用^來進行取反。


7.列出所有網絡連接

 # lsof -i


lsof的-i選項可以列出所有打開了網絡套接字(TCP和UDP)的進程。

列出所有TCP網絡連接

 # lsof -i tcp

也可以為-i選項加上參數,比如tcp,tcp選項會強制lsof只列出打開TCP sockets的進程。

列出所有UDP網絡連接

 # lsof -i udp

同樣udp讓lsof只列出使用UDP socket的進程。

找到使用某個端口的進程

 # lsof -i :25

:25和-i選項組合可以讓lsof列出占用TCP或UDP的25端口的進程。

你也可以使用/etc/services中制定的端口名稱來代替端口號,比如:

 # lsof -i :smtp

找到使用某個udp端口號的進程

 # lsof -i udp:53

同樣的,也可以找到使用某個tcp端口的進程:

 # lsof -i tcp:80

也可以查找ipv4 ipv6鏈接的進程

 # lsof -i 4


8.找到某個用戶的所有網絡連接

 # lsof -a -u hacker -i

使用-a將-u和-i選項組合可以讓lsof列出某個用戶的所有網絡行為。

9.列出所有NFS(網絡文件系統)文件

 # lsof -N

這個參數很好記,-N就對應NFS。

10.列出所有UNIX域Socket文件

 # lsof -U

這個選項也很好記,-U就對應UNIX。

11.列出所有對應某個組id的進程

 # lsof -g 1234

進程組用來來邏輯上對進程進行分組,這個例子查找所有PGID為1234的進程打開的文件。

列出所有與某個描述符關聯的文件

# lsof -d 2

這個命令會列出所有以描述符2打開的文件。

你也可以為描述符指定一個范圍

# lsof -d 0-2

這會列出所有描述符為0,1,2的文件。

-d選項還支持其它很多特殊值,下面的命令列出所有內存映射文件:

# lsof -d mem

txt則列出所有加載在內存中並正在執行的進程

# lsof -d txt

輸出使用某些資源的進程pid

# lsof -t -i

-t選項輸出進程的PID,你可以將它和-i選項組合輸出使用某個端口的進程的PID,下面的命令將會殺掉所有使用網絡的進程:

# kill -9 `lsof -t -i`

循環列出文件

# lsof -r 1

-r選項讓lsof可以循環列出文件直到被中斷,參數1的意思是每秒鍾重復打印一次,這個選項最好同某個范圍比較小的查詢組合使用,比如用來監測網絡活動:

# lsof -r 1 -u john -i -a

最后你可以通過man lsof來了解關於lsof的完整文檔,或者通過lsof -h查看。

參考:
http://www.cnblogs.com/wangkangluo1/archive/2012/04/18/2454916.html

2017年3月21日






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM