1 Introduction

list open files – 一切皆文件

通过文件不仅可以访问常规数据,而且可以访问网络连接和硬件设备,例如TCP,UDP信息.
一般使用root超级权限来进行操作,获取完全信息.

2 File object

  • 普通文件–file
  • 目录–directory
  • 网络文件系统的文件
  • 字符或设备文件
  • (函数)共享库
  • 管道,命名管道
  • 符号链接
  • 网络文件(例如:NFS file,网络socket,unix域名socket)
  • 还有其它类型的文件,等等

3 Output

3.1 输出

  • COMMAND 进程的名称
  • PID 进程标识符
  • PPID 父进程标识符(需要指定-R参数)
  • USER 进程所有者
  • PGID 进程所属组
  • FD 文件描述符,应用程序通过文件描述符识别该文件.如cwd,txt等:
  • TYPE 文件类型,如DIR,REG等,常见的文件类型
  • DEVICE 指定磁盘的名称
  • SIZE 文件的大小
  • NODE 索引节点(文件在磁盘上的标识)
  • NAME 打开文件的确切名称

3.2 FD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cwd:表示current work dirctory,这是该应用程序启动的目录
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库
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/...,例如0r/1u,其中u表示读写模式

3.3 TYPE

  • DIR:表示目录
  • CHR:表示字符类型
  • BLK:块设备类型
  • UNIX: UNIX 域套接字
  • FIFO:先进先出 (FIFO) 队列
  • IPv4:网际协议 (IP) 套接字

4 Command Options

4.1 format

lsof [options] [names]

4.2 options

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-a              列出打开文件存在的进程
-c <进程名> 列出指定进程所打开的文件
-g 列出GID号进程详情
-p <进程号> 列出指定进程号所打开的文件
-u 列出UID号进程详情

-d <文件号> 列出占用该文件号的进程
+d <目录> 列出目录下被打开的文件
+D <目录> 递归列出目录下被打开的文件
-n <目录> 列出使用NFS的文件

-i <条件> 列出符合条件的进程,条件非常重要

+|-r <t> repeat every t seconds; + until no files, - forever

-h 显示帮助信息
-v 显示版本信息

4.3 condition

格式:lsof -i[46] [protocol][@hostname|hostaddr][:service[,servcie2]|port[, port2]]

其中各项:

1
2
3
4
5
6
46          ipv4, ipv6
protocol TCP或者UDP
hostname 域名
hostaddr ip
service /etc/serice中的service,可以有多个
port 端口号

5 Example

5.1 某一个用户

1
2
3
4
5
6
7
# 查看所有用户所有进程的文件打开数目
sudo lsof | wc -l
# 查看当前用户所有进程的文件打开数目
lsof | wc -l
# 查看某个用户打开的文件信息
lsof -u user1
lsof -u user2 <exec_file>

5.2 某一个进程

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看指定的进程
lsof -p <PID>

# 查看某一个文件关联的进程信息
lsof <file>

# 查看某个进程名关联的进程信息
lsof -c <proc_name>
lsof -c mysql
# 列出所有以mysql开头的进程名的文件信息,等价于lsof | grep mysql

# 列出被指定进程打开的所有的IPV4网络描述符(组合)
lsof -i 4 -a -p <pid1>

5.3 网络连接

1
2
3
4
5
6
7
8
9
10
# 
lsof -i
lsof -i tcp
lsof -i :3306

# 列出某个用户所有活跃的网络端口
lsof -a -u user1 -i

# 列出tcp
lsof -i tcp

5.4 hostname

1
2
# 列出指定主机上端口为10/12/80的所有文件信息,每3秒刷新一次
lsof -i @bamboo:10,12,80 -r 3

5.5 port

1
2
3
4
# MAC上查看某一个端口的进程号
sudo lsof -nP -iTCP:端口号 -sTCP:LISTEN
# Linux查看某一个端口
lsof -i:port

6 Mac Example

6.1 Port

1
2
3
4
# 查看某一个端口的进程
sudo lsof -nP -iTCP:端口号 -sTCP:LISTEN
# 查看所有
sudo lsof -nP -iTCP -sTCP:LISTEN

6.2 Process

1
2
# 查看某一个进程占用的端口
sudo lsof -nP -iTCP -sTCP:LISTEN | grep <pid>