梦想还是要有的,万一忘了咋办?

0%

lsof命令

目录:

  • 介绍
  • 所需权限
  • 格式
  • 功能
  • 参数
  • 案例

lsof(list open files)是一个列出当前系统打开文件的工具。

权限

默认只有root用户可以执行lsof命令、普通用户会看到

1
mvn 31261 nobody cwd  unknown /proc/31261/cwd (readlink: Permission denied)

格式

1
lsof [参数][文件]

功能

可以查看的文件包含:

  • 普通文件
  • 目录
  • 网络文件系统的文件
  • 字符或者设备文件
  • (函数)共享库
  • 管道,命名管道
  • 符号连接
  • 网络文件(例如:NFS file、Socket、unix域名的socket)
  • 其他类型文件,等等

参数

参数 描述
-a AND selections (OR)
-c <进程名称> 列出指定<进程名>所打开的文件
-g 列出 GID号的所有进程所打开文件
-d <文件号> 列出占用该文件的进程
+d<目录> 列出目录下被打开的文件
+D<目录> 递归列出目录下被打开的文件
-n<目录> 列出使用NFS的文件
- i<条件> 列出符合条件的进程。
-p<进程号> 列出指定进程号所打开的文件
-u 列出UID号进程所打开的文件
-h 显示帮助信息
-v 显示版本信息

输出内容

列字段

列名 含义
COMMAND 进程的名称
PID 进程号
TID 线程号
USER 进程所有者
FD 文件描述符、应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE 文件类型、如DIR、REG等
DEVICE 指定磁盘的名称
SIZE 文件的大小
NODE 索引节点(文件在磁盘上的标识)
NAME 打开文件的确切名称

文件描述符(FD)

标识 描述
cwd 标识current work dirctory ,应用程序当前工作目录,这是该程序的启动目录,除非它本身对这个目录进行更改
txt 该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnn library references (AIX)
er FD information error (see NAME column)
jId 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 标准错误

**一般标准输出、错误、输入后面跟着文件状态模式:r、w、u、等

  • 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) 套接字

案例

文件案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 显示开启文件abc.txt的进程
lsof abc.txt

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tail 31770 hardy 3r REG 1,4 22 71230947 abc.txt

#显示端口9849运行的什么程序
lsof -i:9849

OMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 9369 root 186u IPv6 518352385 0t0 TCP *:9849 (LISTEN)

#显示目录下被进程开启的文件
lsof +d /usr/local/

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 9369 root cwd DIR 253,1 4096 1442111 /usr/local/nacos

#递归目录下所有目录的文件
lsof +D /usr/local/

#列出root用户打开的文件
lsof -u root

#列出mysql进程打开的文件
lsof -c mysql
# 列出多个进程打开文件
lsof -c mysql -c nginx

# 列出root打开文件、及mysql进程打开的文件
lsof -u root -c mysql

#列出除了非root 用户打开的文件
lsof -u ^root
# 列出进程123、456所打开文件
lsof -p 123,456
# 列出用户组打开的所有文件
lsof -g mydev

网络案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
lsof -i[46][protocol][@hostname|hostaddr][:service|port]
# 46 4表示 ipv4、6表示 ipv6
# protocol TCP|UDP
# 查看 TCP协议
lsof -iTCP@127.0.0.1:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
webstorm 30252 hardy 470u IPv6 0x6a6308ac55873599 0t0 TCP localhost:http-alt (LISTEN)

# 列出所有tcp网络连接信息
lsof -i tcp
# 列出所有ud网络连接信息
lsof -i udp
# 谁在使用80端口
lsof -i :80
# 谁在udp下使用80端口
lsof -i udp:80
# 列出root用户所有活跃的网络端口
lsof -u root -i
# 列出所有网络文件系统
lsof -N
# 域名socket文件
lsof -U
#列出进程号1234 打开的所有ipv4 network files
lsof -i 4 -a -p 1234

# 3秒刷新一次,端口22、80所打开文件信息
lsof -i :22,80 -r 3

# 谁在监听tcp请求
lsof -iTCP -sTCP:LISTEN
# 查看谁监听了tcp8080端口
lsof -iTCP:8080 -sTCP:LISTEN