Linux常用命令-lsof

命令

lsof

描述

list open files
显示进程打开的文件

用法

1
lsof [OPTIONS] [names]

选项

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Options:
Defaults in parentheses; comma-separated set (s) items; dash-separated ranges.
-?|-h 帮助
-a 指定选项之间为与的关系AND (默认为或OR)
-b avoid kernel blocks
-c 指定进程名称,例如chrony,或使用^chrony排除指定进程,或者使用正则/SSHD/i,i表示忽略大小写
+c 指定进程名称长度 (默认为9个字符)
+d 显示目录及目录下被打开的文件和目录
+D 递归显示目录及目录下被打开的文件和目录 (注意可能如果文件较多,可能会比较慢)
-d s select by FD set
-K list tasKs (threads)
-i 显示网络连接,也可以指定具体格式[46][proto][@host|addr][:svc_list|port_list]
-l 显示UID而非用户名
-n 显示IP地址而非主机名
-N 选择NFS文件
-o list file offset
-O no overhead *RISKY*
-P 显示端口号而非服务名称
-R 显示父进程号PPID
-t 只显示PID,可用于批量kill进程
-T disable TCP/TPI info
-U select Unix socket
-- end option scan, 用于文件名中有-的情况,避免和选项冲突
-F 显示指定列,如-Fpcn0. -F? for help
+|-L [l] list (+) suppress (-) link counts < l (0 = all; default = 0)
-p 指定或排除PID,如-p 22或-p ^22
-S 指定超时时间,单位秒,最小值为2 (默认15)
-T qs TCP/TPI Q,St (s) info
-g [s] exclude(^)|select and print process group IDs
+|-r [t[m<fmt>]] 指定刷新间隔时间 (默认15); + until no files, - forever.
也可以指定时间分隔符m<fmt>,如-r3m"=== %F-%T ===";时间格式参考date命令
-s p:s 指定tcp或udp连接状态 (p = TCP|UDP) states by name(s),如-stcp:established
-u 指定或排除用户名或UID
-x [fl] cross over +d|+D File systems or symbolic Links
names 指定文件

参数格式说明:
多个参数用逗号,分隔,如22,80,443
排除指定参数用^表示,如^80,^443
指定范围用-表示,如1-1025

# 显示指定列,如-Fpcn0
$ lsof -F?
ID field description
a access: r = read; w = write; u = read/write
c command name
d device character code
D major/minor device number as 0x<hex>
f file descriptor
G file flaGs
i inode number
k link count
K task ID (TID)
l lock: r/R = read; w/W = write; u = read/write
L login name
m marker between repeated output
n comment, name, Internet addresses
o file offset as 0t<dec> or 0x<hex>
p process ID (PID)
g process group ID (PGID)
P protocol name
r raw device number as 0x<hex>
R paRent PID
s file size
S stream module and device names
t file type
T TCP/TPI info
u user ID (UID)
0 (zero) use NUL field terminator instead of NL

注意

命令lsof需要root权限执行,注意选项中有+|-的区别

示例

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
$ lsof -v
lsof 4.87

# 默认显示所有打开的文件
$ lsof |more
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 244 64 /
systemd 1 root rtd DIR 253,0 244 64 /
systemd 1 root txt REG 253,0 1632744 142231 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20064 10713 /usr/lib64/libuuid.so.1.3.0
...
# 指定文件路径
$ lsof /usr/sbin/sshd | more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 938 root txt REG 253,0 852888 334648 /usr/sbin/sshd
sshd 44209 root txt REG 253,0 852888 334648 /usr/sbin/sshd
# -c 匹配文件名
$ lsof -c ssh |more
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 938 root cwd DIR 253,0 244 64 /
sshd 938 root rtd DIR 253,0 244 64 /
sshd 938 root txt REG 253,0 852888 334648 /usr/sbin/sshd
sshd 938 root mem REG 253,0 61560 10368 /usr/lib64/libnss_files-2.17.so
sshd 938 root mem REG 253,0 68192 59619 /usr/lib64/libbz2.so.1.0.6
...
$ lsof /data/logs/access.log
# +d 显示目录及目录下的文件
$ lsof +d /data

# -i 显示所有网络连接信息
$ lsof -i
# 显示IPv6网络信息
$ lsof -i6
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
chronyd 658 chrony 6u IPv6 21944 0t0 UDP localhost:323
# 显示tcp的22端口信息
$ lsof -i tcp:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 938 root 3u IPv4 26779 0t0 TCP *:ssh (LISTEN)
sshd 44209 root 3u IPv4 471619 0t0 TCP centos7:ssh->192.168.31.6:60266 (ESTABLISHED)
# 显示指定IP地址连接信息
$ lsof -i @192.168.31.11
# 指定协议,IP,端口
$ lsof -i tcp@192.168.31.11:22
# 指定端口范围
$ lsof -i tcp@192.168.31.6:60200-60400
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 44209 root 3u IPv4 471619 0t0 TCP centos7:ssh->192.168.31.6:60266 (ESTABLISHED)
sshd 44211 www 3u IPv4 471619 0t0 TCP centos7:ssh->192.168.31.6:60266 (ESTABLISHED)
# 指定端口, -n 显示IP地址, -P 显示端口号
$ lsof -inP :80
# 指定TCP连接状态为LISTEN
$ lsof -iTCP -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 938 root 3u IPv4 26779 0t0 TCP *:ssh (LISTEN)
$ lsof -itcp -stcp:established

# -p 指定PID
$ ps aux | grep ssh
root 938 0.0 0.2 112984 4360 ? Ss Jan06 0:00 /usr/sbin/sshd -D
$ lsof -p 938
$ lsof -p 44211,44547
# -t 只显示PID
$ lsof -c chrony -t
658
$ ps aux | grep chrony
chrony 658 0.0 0.1 120620 2092 ? S Jan06 0:04 /usr/sbin/chronyd
# -rm 指定分隔符格式, -r5 指定每5s刷新一次, 也可以合并为-r5m"==="
$ lsof -rm"==== %F-%T ====" -r5 -i udp
# -u 指定用户名或uid,查看www用户打开的文件
$ lsof -u www
# -a 选项之间是与的关系
$ lsof -i :22 -a -u root
$ lsof -i :22 -u ^www
# 显示指定列
$ lsof -F?
$ lsof -Fpcn0 /usr/sbin/sshd
p938csshd
n/usr/sbin/sshd
p44209csshd
n/usr/sbin/sshd
$ lsof -i udp -nP -Fpcn0
p658cchronyd
n127.0.0.1:323
n[::1]:323