lsof全名list opened files,也就是列举系统中已经被打开的文件。我们都知道,linux环境中,任何事物都是文件,设备是文件,目录是文件,甚至sockets也是文 件。所以,用好lsof命令,对日常的linux管理非常有帮助。以下的说明,大部分内容来自lsof的manual文档。我所做的只是在中文翻译的基础 上,进行简单的分类说明,并列举最常用的参数。

一、输出说明

lsof是linux最常用的命令之一,通常的输出格式为:

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

常见包括如下几个字段:更多的可见manual。

1、COMMAND 默认以9个字符长度显示的命令名称。可使用+c参数指定显示的宽度,若+c后跟的参数为零,则显示命令的全名

2、PID:进程的ID号

3、PPID 父进程的IP号,默认不显示,当使用-R参数可打开。

4、PGID 进程组的ID编号,默认也不会显示,当使用-g参数时可打开。

5、USER 命令的执行UID或系统中登陆的用户名称。默认显示为用户名,当使用-l参数时,可显示UID。

6、FD 是文件的File Descriptor number,或者如下的内容: (这里很难翻译对应的意思,保留英文)

cwd  current working directory;
Lnn  library references (AIX);
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);
txt  program text (code and data);
v86  VP/ix mapped file;

文件的File Descriptor number显示模式有:

r for read access;
w for write access;
u for read and write access;
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.

7、TYPE

IPv4 IPv4的包; IPv6 使用IPv6格式的包,即使地址是IPv4的,也会显示为IPv6,而映射到IPv6的地址; DIR 目录 LINK 链接文件

详情请看manual中更多的注释。

8、DEVICE 使用character special、block special表示的设备号

9、SIZE 文件的大小,如果不能用大小表示的,会留空。使用-s参数控制。

10、NODE 本地文件的node码,或者协议,如TCP等

11、NAME 挂载点和文件的全路径(链接会被解析为实际路径),或者连接双方的地址和端口、状态等

二、参数

1、不带额外参数运行

lsof path/filename

显示已打开该目录或文件的所有进程信息

lsof which httpd

显示指定命令的信息

2、参见参数

-c w 显示以w开头命令的已打开文件的信息

lsof -c sshd

-p PID 显示指定PID已打开文件的信息

lsof -p 4401

+d dir 依照文件夹dir来搜寻,但不会打开子目录

lsof +d /root

+D dir 打开dir文件夹以及其子目录搜寻

lsof +D /root/

-d s 以FD列的信息进行匹配,可使用3-10,表示范围,3,10表示某些值

lsof -d 3-10

-u 显示某用户的已经打开的文件(或该用户执行程序已经打开的文件)

lsof -u root
lsof -u 0

◎可配合正规表达式使用 表示不包括root用户的信息:

lsof -u ^root

-i 监听指定的协议、端口、主机等的网络信息,格式为:

[46][proto][@host|addr][:svc_list|port_list]

例如:

lsof -i为防备电子邮件地址收集器,这个 E-mail 地址被隐藏,你的浏览器必须支持 Javascript 才可看到这个邮件地址

lsof -i:22

还可以使用一些参数控制显示结果:

-l 禁止将userID转换为登陆名称,即显示UID

-n 禁止将IP地址转换为hostname主机文件

-P 不显示端口名称

-g s 从PGID列进行匹配

lsof -g 3-10

3、其他参数

+f 所有路径参数都必须是文件系统,否则不能执行

-f 所有路径参数都将作为普通的文件,例如:"-f – /“中的/,只会匹配单个/路径,而不会是根目录中的所有文件

+f和-f后都应加上“–”表终结符:

lsof -f -- /

+L/-L 打开或关闭文件的连结数计算,当+L没有指定时,所有的连结数都会显示(默认);若+L后指定数字,则只要连结数小于该数字的信息会显示;连结数会显示在NLINK列。

例如:+L1将显示没有unlinked的文件信息;+aL1,则显示指定文件系统所有unlinked的文件信息

-L 默认参数,其后不能跟数字,将不显示连结数信息

lsof +L1

-t 仅打印进程,方便shell脚本调用

lsof -t -c sshd

-F 指定输出那个列,可通过lsof -F?查看

-r 不断执行lsof命令,默认每15秒间隔执行一次

+r 也是不断执行lsof命令,但直到没有接受到文件信息,则停止