奇迹之流WonderfloW

Nothing Replaces Hard Work!

UNIX之lsof命令

| Comments

据说lsof命令很强大,就学习了一下。这个网站讲的最好,翻译如下:

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以lsof被称为unix系统检测的瑞士军刀。

那怎么用呢?

接下来我们一个个来看。

罗列出所有的文件设备情况.
1
$ lsof

不带参数的运行 

lsof 就是列出所有被进程打开的文件。

查看文件被谁使用.
1
$ lsof /path/to/file

如果把文件路径作为参数,lsof命令会把用到这个文件的所有进程都罗列出来。 也可以加多个路径在后面,它会把所涉及到这些文件的进程都罗列出来:

1
$ lsof /path/to/file1 /path/to/file2

递归查找所有打开的文件
1
$ lsof +D /usr/lib

使用+D参数,加路径,就是递归查找目录下所有被打开的文件. 当然,显然没有用 

grep的如下命令快:

1
$ lsof | grep '/usr/lib'

列出某用户的所有打开的端口.
1
$ lsof -u root

-u参数就是把所有后面指定用户打开的文件列出来. 也可以列出好几个用户打开的,用逗号分隔:

1
$ lsof -u vcap,root

另外的方法就是使用 

-u 参数两次:

1
$ lsof -u rms -u root

通过程序名.
1
$ lsof -c apache

-c 参数就是筛选出进程名为apache的。 同样的:

1
$ lsof | grep foo

跟这个是一样的。

1
$ lsof -c foo

打前半部分也可以进行查找

1
$ lsof -c apa

通过多次使用-c选项可以多个进程名称的匹配

1
$ lsof -c apache -c python

如果你同时使用-u和-c参数.
1
$ lsof -u pkrumins -c apache

其作用是“或”,即列出符合上述条件之一的.

加上'-a'参数,就是and,两个条件共同满足的效果.
1
$ lsof -a -u pkrumins -c bash

列出不包含root的所有用户.
1
$ lsof -u ^root

注意到 

^ 这个符号.

通过进程号查找-p(PID).
1
$ lsof -p 1

用逗号分隔可以添加多个要查找的进程号

1
$ lsof -p 450,980,333

使用^符号对进程号也有排除功能.
1
$ lsof -p ^1

列出所有的网络连接
1
$ lsof -i

-i 参数列出所有(TCP和UDP)连接的进程

列出所有TCP连接.
1
$ lsof -i tcp

同理,列出所有UDP连接.
1
$ lsof -i udp

查看谁在使用该端口.
1
$ lsof -i :25

参数 

:25 和 -i 让 lsof命令查找使用TCP 或 UDP进行连接的端口号为25的进程. 也可以用:后跟服务的名字(可以在这里查看 /etc/services) :

1
$ lsof -i :smtp

查看一个特定的UDP端口的使用者.
1
$ lsof -i udp:53

同样的,TCP端口使用者查看命令:

1
$ lsof -i tcp:80

查看所有用户hacker的网络连接.
1
$ lsof -a -u hacker -i

-a 参数起到一个and的作用-u 表示用户 -i 表示网络连接.

列出所有 NFS (Network File System)文件.
1
$ lsof -N

很容易记住 

-N 就是 NFS.

列出 Unix 域套接字.
1
$ lsof -U

列出特定进程组的进程文件.
1
$ lsof -g 1234

根据文件描述符指定查找.
1
$ lsof -d 2

查找一个范围0~2

1
$ lsof -d 0-2

There are also many special values, such as 

mem, that lists memory-mapped files:

1
$ lsof -d mem

Or txt for programs loaded in memory and executing:

1
$ lsof -d txt

根据条件输出所有的进程号.
1
$ lsof -t -i

-t 参数就是只输出进程号,和 -i 参数一起用就是把有网络连接的进程号列出来. 杀死所有有网络连接的进程可以这么做:

1
$ kill -9 `lsof -t -i`

-r参数就是repeat,重复执行.
1
$ lsof -r 1

-r 参数就是重复,后面的数字1表示每隔1s重复执行一遍。用于监控活动的连接的话,这个连接很重要:

1
$ lsof -r 1 -u john -i -a