Fu
Simple is Beautiful!

linux command之lsof

lsof 是 list open files 的简写, 在 Unix-like 系统中经常被用来列出系统中所有被打开的文件,以及由哪些进程打开它们的。

在 Unix-like 中,“一切皆文件”, 包括普通文件、文件夹、设备文件、字符文件、正在被程序执行的文本段索引、库、流和网络文件(Internet socket、NFS 文件、Unix domain socket)。

列出打开文件

列出系统中所有打开文件需要 root 权限:

# lsof
COMMAND     PID   USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
init          1   root  cwd       DIR                8,3     4096          2 /
init          1   root  rtd       DIR                8,3     4096          2 /
init          1   root  txt       REG                8,3   150352     527181 /sbin/init
init          1   root  mem       REG                8,3    65928     654110 /lib64/libnss_files-2.12.so
init          1   root    0u      CHR                1,3      0t0       4021 /dev/null

lsof 输出各列信息的意义如下:

列出某用户所打开文件

使用 -u 选项列出指定某个用户打开文件,其后可以是 login name 或 UID:

lsof -u apache

也可以列出多个用户所打开的文件:

lsof -u apache,vim,211

使用 ^ 来排除某用户打开的文件:

lsof -u apache,vim,^211

列出某用户组所打开文件

-u 类似,-g 是用来指定用户组:

lsof -g 123,^wheel

列出某进程所打开文件

使用 -p 可以列出指定进程所打开的文件:

lsof -p 123,456,^789

列出某命令名所打开文件

使用 -c 可以列出某命令名以指定字符串开头的进程所打开的文件:

lsof -c abc

可以求反:

lsof -c ^abc

可以组合多个 -c

lsof -c abc -c def

列出相关网络连接

使用 -i [46][protocol][@hostname|hostaddr][:service|port] 可以列出系统中所打开的网络链接:

其后如果无参数,默认列出所有网络链接:

lsof -i
-i 6           # IPv6 only
-i TCP:25      # TCP and port 25
-i @1.2.3.4    # Internet IPv4 host address 1.2.3.4
-i @[3ffe:1ebc::1]:1234   # Internet IPv6 host address 3ffe:1ebc::1, port 1234
-i UDP:who                # UDP who service port
-i TCP@lsof.itap:513      # TCP, port 513 and host name lsof.itap
-i tcp@foo:1-10,smtp,99   # TCP, ports 1 through 10, service name smtp, port 99, host name foo
-i tcp@bar:1-smtp         # TCP, ports 1 through smtp, host bar
-i :time                  # either TCP, UDP or UDPLITE time service port

AND 选项

-a 做 AND 操作

lsof -a -u fu -i tcp:25

列出打开文件的特定域

-t 选项可以很方便的列出 PID:

lsof -t

当是更通用的是 -F f,用来列出指定列:

可以通过 -F ? 来查看都有哪些参数。

linux31CLI17
2015-05-16 21:37:00