Lsof - 列出打开的文件

lsof 是 LiSt Open Files 的缩写,以列表的形式显示文件被哪个进程打开,文件包括磁盘文件、网络套接字、管道、设备。 使用这条命令的主要情形之一就是在无法卸载磁盘和显示正在使用或者打开某个文件的错误信息的时候。 使用这条命令,你可以很容易地看到正在使用哪个文件。 [1]

语法

lsof[-?abhlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]] [+|-e s] [-F [f]] [-g [s]] [-i [i]]
[+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s] [+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]

示例

列出所有打开的文件

lsof

COMMAND    PID      USER   FD (文件描述符)        TYPE(文件类型)     DEVICE  SIZE/OFF       NODE NAME
init         1      root  cwd (当前工作目录)      DIR (目录)         253,0      4096          2 /
init         1      root  rtd (root目录)          DIR (目录)         253,0      4096          2 /
init         1      root  txt (程序代码和数据)   REG (普通文件)     253,0    145180     147164 /sbin/init
init         1      root  mem (内存映射文件)      REG (普通文件)     253,0   1889704     190149 /lib/libc-2.12.so
nginx     23780     nginx  0u(读写访问)         CHR (特殊字符文件) 1,3         0t0  188451717 /dev/null
rsyslogd   3856     root   1r(读访问)           REG (普通文件)     144,8         0 4026545856 /proc/kmsg
mysqld    32336     mysql  2w(写访问)           FIFO(先入先出)     0,6         0t0  126330358 pipe

列出指定进程打开的文件

lsof -p 23780

COMMAND   PID  USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
nginx   23780 nginx  cwd    DIR              144,7     4096 188448964 /
nginx   23780 nginx  rtd    DIR              144,7     4096 188448964 /
nginx   23780 nginx  txt    REG              144,7   825320 188454748 /usr/sbin/nginx
nginx   23780 nginx  mem    REG                8,5          188454748 /usr/sbin/nginx (path dev=144,7)

列出指定用户打开的文件

lsof -u nginx

COMMAND   PID  USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
nginx   23780 nginx  cwd    DIR              144,7     4096 188448964 /
nginx   23780 nginx  rtd    DIR              144,7     4096 188448964 /
nginx   23780 nginx  txt    REG              144,7   825320 188454748 /usr/sbin/nginx
nginx   23780 nginx  mem    REG                8,5          188454748 /usr/sbin/nginx (path dev=144,7)

列出所有网络连接

lsof -i

仅列出IPv4网络连接

lsof -i 4

仅列出TCP连接

lsof -i TCP

列出正在监听的网络连接

lsof -i -s TCP:LISTEN

列出已建立的网络连接

lsof -i -s TCP:ESTABLISHED

列出运行在指定端口上的进程

lsof -i TCP:80

COMMAND   PID  USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
nginx   23780 nginx    3u  IPv4 338498973      0t0  TCP lfzyx.org:http->58.137.148.210:57582 (ESTABLISHED)
nginx   23780 nginx    6u  IPv4    250008      0t0  TCP *:http (LISTEN)
nginx   23780 nginx   19u  IPv4 338498376      0t0  TCP lfzyx.org:http->150-70-75-34.trendmicro.com:54366 (ESTABLISHED)
nginx   23780 nginx   22u  IPv4 338498234      0t0  TCP lfzyx.org:http->wf-171-99-47-76.revip9.asianet.co.th:18447 (ESTABLISHED)
nginx   32446  root    6u  IPv4    250008      0t0  TCP *:http (LISTEN)

列出运行在指定端口范围上的进程

lsof -i TCP:1-1024

COMMAND   PID   USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
portmap  3759 daemon    5u  IPv4    249950      0t0  TCP *:sunrpc (LISTEN)
nginx   23780  nginx    3u  IPv4 338529365      0t0  TCP lfzyx.org:http->ppp-124-121-2-252.revip2.asianet.co.th:64427 (ESTABLISHED)
nginx   23780  nginx    6u  IPv4    250008      0t0  TCP *:http (LISTEN)
nginx   32446   root    6u  IPv4    250008      0t0  TCP *:http (LISTEN)

列出到指定主机的连接

lsof -i @10.10.10.118[:8080]

列出除root用户打开的文件

lsof -u ^root

参考文献

[1]10 lsof Command Examples in Linux