linux lsof 用法简介
https://www.cnblogs.com/saneri/p/5333333.html
1.简介:
lsof(list open files)是一个列出当前系统打开文件的工具。
只需输入 lsof 就可以生成大量的信息,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
常用参数:
lsof语法格式是:
lsof [options] filename
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
lsof filename 显示打开指定文件的所有进程
lsof
-
a 表示两个参数都必须满足时才显示结果
lsof
-
c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof
-
u username 显示所属user进程打开的文件
lsof
-
g gid 显示归属gid的进程情况
lsof
+
d
/
DIR
/
显示目录下被进程打开的文件
lsof
+
D
/
DIR
/
同上,但是会搜索目录下的所有目录,时间相对较长
lsof
-
d FD 显示指定文件描述符的进程
lsof
-
n 不将IP转换为hostname,缺省是不加上
-
n参数
lsof
-
i 用以显示符合条件的进程情况
lsof
-
i[
46
] [protocol][@hostname|hostaddr][:service|port]
46
-
-
> IPv4
or
IPv6
protocol
-
-
> TCP
or
UDP
hostname
-
-
> Internet host name
hostaddr
-
-
> IPv4地址
service
-
-
>
/
etc
/
service中的 service name (可以不只一个)
port
-
-
> 端口号 (可以不只一个)
|
lsof 的示例输出:
1
2
3
4
5
6
|
[root@localhost ~]
# lsof
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
init
1
root cwd
DIR
253
,
0
4096
2
/
init
1
root rtd
DIR
253
,
0
4096
2
/
init
1
root txt REG
253
,
0
150352
2228266
/
sbin
/
init
init
1
root mem REG
253
,
0
65928
1966110
/
lib64
/
libnss_files
-
2.12
.so
|
lsof输出各列信息的意义如下:
1
2
3
4
5
6
7
8
|
lsof输出各列信息的意义如下:<br>
COMMAND:进程的名称 PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE
:文件类型,如
DIR
、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
|
2.lsof常用用法:
2.1 监控网络
查看指定端口有哪些进程在使用(lsof -i 列出所有的打开的网络连接):
1
2
3
4
5
6
|
[root@localhost ~]
# lsof -i:22
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
sshd
17909
root
3u
IPv4
2089344
0t0
TCP wx.
9888.cn
:ssh
-
>bogon:
61574
(ESTABLISHED)
sshd
17911
www
3u
IPv4
2089344
0t0
TCP wx.
9888.cn
:ssh
-
>bogon:
61574
(ESTABLISHED)
sshd
17933
root
3u
IPv4
277791
0t0
TCP
*
:ssh (LISTEN)
sshd
17933
root
4u
IPv6
277793
0t0
TCP
*
:ssh (LISTEN)
|
列出被某个进程打开所有的网络文件:
1
2
3
|
[root@localhost ~]
# lsof -i -a -p 29091
或者
[root@localhost ~]
#lsof -i -a -c ssh
|
列出所有 tcp、udp 连接:
1
2
|
lsof
-
i tcp;
lsof
-
i udp;
|
列出所有 NFS 文件:
1
|
[root@E08
-
8th02
~]
# lsof -N -u www -a
|
2.2 监控打开的文件设备:
查看文件、设备被哪些进程占用
1
2
3
|
[root@localhost ~]
# lsof /dev/tty1
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
Xorg
1648
root
6u
CHR
4
,
1
0t0
5613
/
dev
/
tty1
|
2.3 监控文件系统:
指定目录、挂载点,可以看到有哪些进程打开了其下的文件:
1
2
3
4
|
# lsof /data/
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
bash
15983
jian cwd
DIR
8
,
5
4096
8252
/
data
/
backup
#这在 umount 某个文件系统失败时非常有用(通常会报该 FS is busy)
|
列出某个目录(挂载点 如 /home 也行)下被打开的文件:
1
2
3
4
5
|
# lsof +D /var/log/
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
rsyslogd
488
syslog
1w
REG
8
,
1
1151
268940
/
var
/
log
/
syslog
rsyslogd
488
syslog
2w
REG
8
,
1
2405
269616
/
var
/
log
/
auth.log
console
-
k
144
root
9w
REG
8
,
1
10871
269369
/
var
/
log
/
ConsoleKit
/
history
|
列出被指定进程名打开的文件
1
2
3
4
5
6
7
|
[root@localhost ~]
# lsof -c ssh -c init
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
init
1
root cwd
DIR
253
,
0
4096
2
/
init
1
root rtd
DIR
253
,
0
4096
2
/
init
1
root txt REG
253
,
0
150352
2228266
/
sbin
/
init
init
1
root mem REG
253
,
0
65928
1966110
/
lib64
/
libnss_files
-
2.12
.so
init
1
root DEL REG
253
,
0
1966094
/
lib64
/
libc
-
2.12
.so
|
2.4 监控进程:
指定进程号,可以查看该进程打开的文件:
1
2
3
4
5
|
[root@localhost ~]
# lsof -p 29084
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
nginx
29084
www cwd
DIR
253
,
0
4096
2359841
/
apps
/
product
/
nginx
/
conf
nginx
29084
www rtd
DIR
253
,
0
4096
2
/
nginx
29084
www txt REG
253
,
0
5497249
2359840
/
apps
/
product
/
nginx
/
sbin
/
nginx
|
当你想要杀掉某个用户所有打开的文件、设备,你可以这样:
1
2
|
kill
-
9
`lsof
-
t
-
u www`
#此处 -t 的作用是单独的列出 进程 id 这一列。
|
2.5 监控用户:
查看指定用戶打开的文件(lsof -u ^www可以排除某用户):
1
2
3
4
5
6
|
[root@localhost ~]
# lsof -u www
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
tail
2409
www cwd
DIR
253
,
0
4096
2
/
tail
2409
www rtd
DIR
253
,
0
4096
2
/
tail
2409
www txt REG
253
,
0
61368
670089
/
usr
/
bin
/
tail
tail
2409
www mem REG
253
,
0
156928
1972676
/
lib64
/
ld
-
2.12
.so
|
2.6 监控应用程序:
查看指定程序打开的文件:
1
2
3
4
5
|
[root@localhost ~]
# lsof -c nginx
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
nginx
28624
root cwd
DIR
253
,
0
4096
2359841
/
apps
/
product
/
nginx
/
conf
nginx
28624
root rtd
DIR
253
,
0
4096
2
/
nginx
28624
root txt REG
253
,
0
5497249
2359840
/
apps
/
product
/
nginx
/
sbin
/
nginx
|
2.7 组合逻辑查询条件:
只有多个查询条件都满足, 用 "-a" 参数,默认是 -o 。
1
2
3
4
5
6
7
|
[root@localhost ~]
# lsof -a -c bash -u root
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
bash
25602
root cwd
DIR
253
,
0
4096
1572865
/
root
bash
25602
root rtd
DIR
253
,
0
4096
2
/
bash
25602
root txt REG
253
,
0
938832
1703983
/
bin
/
bash
bash
25602
root mem REG
253
,
0
156928
1972676
/
lib64
/
ld
-
2.12
.so
bash
25602
root mem REG
253
,
0
22536
1972681
/
lib64
/
libdl
-
2.12
.so
|
1.简介:
lsof(list open files)是一个列出当前系统打开文件的工具。
只需输入 lsof 就可以生成大量的信息,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
常用参数:
lsof语法格式是:
lsof [options] filename
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
lsof filename 显示打开指定文件的所有进程
lsof
-
a 表示两个参数都必须满足时才显示结果
lsof
-
c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof
-
u username 显示所属user进程打开的文件
lsof
-
g gid 显示归属gid的进程情况
lsof
+
d
/
DIR
/
显示目录下被进程打开的文件
lsof
+
D
/
DIR
/
同上,但是会搜索目录下的所有目录,时间相对较长
lsof
-
d FD 显示指定文件描述符的进程
lsof
-
n 不将IP转换为hostname,缺省是不加上
-
n参数
lsof
-
i 用以显示符合条件的进程情况
lsof
-
i[
46
] [protocol][@hostname|hostaddr][:service|port]
46
-
-
> IPv4
or
IPv6
protocol
-
-
> TCP
or
UDP
hostname
-
-
> Internet host name
hostaddr
-
-
> IPv4地址
service
-
-
>
/
etc
/
service中的 service name (可以不只一个)
port
-
-
> 端口号 (可以不只一个)
|
lsof 的示例输出:
1
2
3
4
5
6
|
[root@localhost ~]
# lsof
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
init
1
root cwd
DIR
253
,
0
4096
2
/
init
1
root rtd
DIR
253
,
0
4096
2
/
init
1
root txt REG
253
,
0
150352
2228266
/
sbin
/
init
init
1
root mem REG
253
,
0
65928
1966110
/
lib64
/
libnss_files
-
2.12
.so
|
lsof输出各列信息的意义如下:
1
2
3
4
5
6
7
8
|
lsof输出各列信息的意义如下:<br>
COMMAND:进程的名称 PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE
:文件类型,如
DIR
、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
|
2.lsof常用用法:
2.1 监控网络
查看指定端口有哪些进程在使用(lsof -i 列出所有的打开的网络连接):
1
2
3
4
5
6
|
[root@localhost ~]
# lsof -i:22
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
sshd
17909
root
3u
IPv4
2089344
0t0
TCP wx.
9888.cn
:ssh
-
>bogon:
61574
(ESTABLISHED)
sshd
17911
www
3u
IPv4
2089344
0t0
TCP wx.
9888.cn
:ssh
-
>bogon:
61574
(ESTABLISHED)
sshd
17933
root
3u
IPv4
277791
0t0
TCP
*
:ssh (LISTEN)
sshd
17933
root
4u
IPv6
277793
0t0
TCP
*
:ssh (LISTEN)
|
列出被某个进程打开所有的网络文件:
1
2
3
|
[root@localhost ~]
# lsof -i -a -p 29091
或者
[root@localhost ~]
#lsof -i -a -c ssh
|
列出所有 tcp、udp 连接:
1
2
|
lsof
-
i tcp;
lsof
-
i udp;
|
列出所有 NFS 文件:
1
|
[root@E08
-
8th02
~]
# lsof -N -u www -a
|
2.2 监控打开的文件设备:
查看文件、设备被哪些进程占用
1
2
3
|
[root@localhost ~]
# lsof /dev/tty1
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
Xorg
1648
root
6u
CHR
4
,
1
0t0
5613
/
dev
/
tty1
|
2.3 监控文件系统:
指定目录、挂载点,可以看到有哪些进程打开了其下的文件:
1
2
3
4
|
# lsof /data/
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
bash
15983
jian cwd
DIR
8
,
5
4096
8252
/
data
/
backup
#这在 umount 某个文件系统失败时非常有用(通常会报该 FS is busy)
|
列出某个目录(挂载点 如 /home 也行)下被打开的文件:
1
2
3
4
5
|
# lsof +D /var/log/
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
rsyslogd
488
syslog
1w
REG
8
,
1
1151
268940
/
var
/
log
/
syslog
rsyslogd
488
syslog
2w
REG
8
,
1
2405
269616
/
var
/
log
/
auth.log
console
-
k
144
root
9w
REG
8
,
1
10871
269369
/
var
/
log
/
ConsoleKit
/
history
|
列出被指定进程名打开的文件
1
2
3
4
5
6
7
|
[root@localhost ~]
# lsof -c ssh -c init
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
init
1
root cwd
DIR
253
,
0
4096
2
/
init
1
root rtd
DIR
253
,
0
4096
2
/
init
1
root txt REG
253
,
0
150352
2228266
/
sbin
/
init
init
1
root mem REG
253
,
0
65928
1966110
/
lib64
/
libnss_files
-
2.12
.so
init
1
root DEL REG
253
,
0
1966094
/
lib64
/
libc
-
2.12
.so
|
2.4 监控进程:
指定进程号,可以查看该进程打开的文件:
1
2
3
4
5
|
[root@localhost ~]
# lsof -p 29084
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
nginx
29084
www cwd
DIR
253
,
0
4096
2359841
/
apps
/
product
/
nginx
/
conf
nginx
29084
www rtd
DIR
253
,
0
4096
2
/
nginx
29084
www txt REG
253
,
0
5497249
2359840
/
apps
/
product
/
nginx
/
sbin
/
nginx
|
当你想要杀掉某个用户所有打开的文件、设备,你可以这样:
1
2
|
kill
-
9
`lsof
-
t
-
u www`
#此处 -t 的作用是单独的列出 进程 id 这一列。
|
2.5 监控用户:
查看指定用戶打开的文件(lsof -u ^www可以排除某用户):
1
2
3
4
5
6
|
[root@localhost ~]
# lsof -u www
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
tail
2409
www cwd
DIR
253
,
0
4096
2
/
tail
2409
www rtd
DIR
253
,
0
4096
2
/
tail
2409
www txt REG
253
,
0
61368
670089
/
usr
/
bin
/
tail
tail
2409
www mem REG
253
,
0
156928
1972676
/
lib64
/
ld
-
2.12
.so
|
2.6 监控应用程序:
查看指定程序打开的文件:
1
2
3
4
5
|
[root@localhost ~]
# lsof -c nginx
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
nginx
28624
root cwd
DIR
253
,
0
4096
2359841
/
apps
/
product
/
nginx
/
conf
nginx
28624
root rtd
DIR
253
,
0
4096
2
/
nginx
28624
root txt REG
253
,
0
5497249
2359840
/
apps
/
product
/
nginx
/
sbin
/
nginx
|
2.7 组合逻辑查询条件:
只有多个查询条件都满足, 用 "-a" 参数,默认是 -o 。
1
2
3
4
5
6
7
|
[root@localhost ~]
# lsof -a -c bash -u root
COMMAND PID USER FD
TYPE
DEVICE SIZE
/
OFF NODE NAME
bash
25602
root cwd
DIR
253
,
0
4096
1572865
/
root
bash
25602
root rtd
DIR
253
,
0
4096
2
/
bash
25602
root txt REG
253
,
0
938832
1703983
/
bin
/
bash
bash
25602
root mem REG
253
,
0
156928
1972676
/
lib64
/
ld
-
2.12
.so
bash
25602
root mem REG
253
,
0
22536
1972681
/
lib64
/
libdl
-
2.12
.so
|