[转帖]linux lsof 用法简介 linux lsof 用法简介

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  + / DIR /      显示目录下被进程打开的文件
lsof  + / 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 - 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  - - 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  + / DIR /      显示目录下被进程打开的文件
lsof  + / 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 - 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  - - 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

猜你喜欢

转载自www.cnblogs.com/jinanxiaolaohu/p/12049038.html