开源是一种精神,分享是一种美德!

lsof

相关命令:暂无相关命令
lsof(list open files)是一个列出当前系统打开文件的工具。

在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。

所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。

因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

lsof 命令可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

用法和参数

用法:

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]] [-Z [Z]] [--] [names]

参数说明:

    -? -h #显示出lsof的帮助信息    
    -a #参数被视为AND,会影响全部的参数   
    -c c #显示出以字符或字符串c开头的命令程序开启的文件,如$lsof -c init   
    +d s #在文件夹s下搜寻,此参数不会继续深入搜寻此文件夹。如显示在/usr/local下被程序开启的文件:$lsof +d /usr/local +D D 同上,但是会以该文件为基础往下全部搜寻,这样花费较大的CPU时 间,请谨慎使用   
    -d s #此参数以file descriptor(FD)值显示结果,可以采用范围(1-3)或个别,如显示FD为4的进程:$lsof -d 4   
    -g [s] #以程序的PGID显示,也可以采用范围或个别表示,若没有特别指定,则显示全部,如显示PGID为6的进程:$lsof -g 6   
    -i #用以监听有关的任何符合的地址,若没有相关地址被指定,则监听全部   
            用法: lsof -i [46][protocol][@hostname|hostaddr][:serivce|port]   
            说明: 4 6  IPv4 或 IPv6   
    protocol TCP or UDP   
    hostname internet host name   
    hostaddr IPv4地址   
    service /etc/service中的service name   
    port 端口号   
    -l #此参数禁止将user ID 转换为登录的名称,默认是登录名称   
    +|-L [l] # +或-表示开启或关闭显示文件连接数,如果只有单纯的+L,后面没有任何数字,则表示显示全部,如果后面有数字,只有文件连接数少于该数字的会被列出   
    -n #不将IP地址转换为hostname,预设是转换的   
    -N #显示NFS的文件   
    -p s #以PID作为显示的依据   
    -P #此参数禁止将port number转换为service name,预设为转换   
    +|-r [t] #控制lsof不断重复执行,t为15秒,也就是说每隔15秒再重复执行 +r 一直执行,直到没有文件被显示 -r 永远不断的执行,直到收到中断讯号(ctrl+ c)   
    -R #此参数增列出PID的子程序,也就是PPID   
    -s #列出文件的大小,若该文件没有大小,则留下空白   
    -u s #列出login name或UID为的程序   
    -v #显示lsof的版本信息   


a,列出所有正在使用文件


[root@localhost zhangy]# lsof 

b,找出谁在使用某个文件


[root@localhost zhangy]# lsof /usr/sbin/httpd
COMMAND  PID   USER  FD   TYPE DEVICE   SIZE    NODE NAME
httpd   3738   root txt    REG    8,6 319380 2697479 /usr/sbin/httpd
httpd   3793 zhangy txt    REG    8,6 319380 2697479 /usr/sbin/httpd
httpd   3794 zhangy txt    REG    8,6 319380 2697479 /usr/sbin/httpd
httpd   3795 zhangy txt    REG    8,6 319380 2697479 /usr/sbin/httpd

c,递归查找某个目录中所有打开的文件


[root@localhost zhangy]# lsof +D /usr/local
COMMAND    PID   USER  FD   TYPE DEVICE    SIZE    NODE NAME
ruby      3754   root txt    REG    8,6 5985821 3151658 /usr/local/ruby/bin/ruby
ruby      3754   root mem    REG    8,6   10513 3177073 /usr/local/ruby/lib/ruby/1.9.1/i686-linux/enc/encdb.so
ruby      3754   root mem    REG    8,6    7960 3177560 /usr/local/ruby/lib/ruby/1.9.1/i686-linux/fcntl.so

d,列出某个用户打开的所有文件


[root@localhost zhangy]# lsof -u zhangy |more     #单个用户
COMMAND  PID   USER   FD   TYPE DEVICE    SIZE    NODE NAME
httpd   3793 zhangy  cwd    DIR    8,6    4096       2 /
httpd   3793 zhangy  rtd    DIR    8,6    4096       2 /
httpd   3793 zhangy  txt    REG    8,6  319380 2697479 /usr/sbin/httpd
httpd   3793 zhangy  mem    REG    8,6  162724 2699347 /usr/lib/libapr-1.so.0.2.7
httpd   3793 zhangy  mem    REG    8,6  245376 2881960 /lib/libsepol.so.1
httpd   3793 zhangy  mem    REG    8,6  293308 2882226 /lib/libssl.so.0.9.8e

[root@localhost zhangy]# lsof -u zhangy,root    #多个用户

e,查找某个程序打开的所有文件


[root@localhost zhangy]# lsof -c httpd

f,列出除root用户外的所有用户打开的文件


[root@localhost zhangy]# lsof -u ^root

g,列出所有由某个PID对应的进程打开的文件


[root@localhost zhangy]# lsof -p 3738

h,列出所有网络连接


[root@localhost zhangy]# lsof -i

i,列出所有TCP网络连接


[root@localhost zhangy]# lsof -i tcp

j,找到使用某个端口的进程


[root@localhost zhangy]# lsof -i:80         #查看一下80端口的进程
COMMAND  PID   USER   FD   TYPE DEVICE SIZE NODE NAME
httpd   3738   root    3u  IPv6  10791       TCP *:http (LISTEN)
httpd   3793 zhangy    3u  IPv6  10791       TCP *:http (LISTEN)
httpd   3794 zhangy    3u  IPv6  10791       TCP *:http (LISTEN)
httpd   3795 zhangy    3u  IPv6  10791       TCP *:http (LISTEN)
httpd   3796 zhangy    3u  IPv6  10791       TCP *:http (LISTEN)
httpd   3797 zhangy    3u  IPv6  10791       TCP *:http (LISTEN)

[root@localhost zhangy]# lsof -i udp:53     #查看 一下udp,53端口
COMMAND  PID   USER   FD   TYPE DEVICE SIZE NODE NAME
dnsmasq 3939 nobody    7u  IPv4  11321       UDP 192.168.122.1:domain 


[root@S1 2014-08-18]# lsof -i 4    #列举出IP V4 
COMMAND     PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
portreser  1642    root    5u  IPv4  10219      0t0  UDP *:ldaps 
rpcbind    1710     rpc    6u  IPv4  10451      0t0  UDP *:sunrpc 
rpcbind    1710     rpc    7u  IPv4  10453      0t0  UDP *:hmmp-op 
rpcbind    1710     rpc    8u  IPv4  10454      0t0  TCP *:sunrpc (LISTEN)
rpc.statd  1836 rpcuser    5u  IPv4  10740      0t0  UDP *:740 
rpc.statd  1836 rpcuser    8u  IPv4  10748      0t0  UDP *:40829 
rpc.statd  1836 rpcuser    9u  IPv4  10752      0t0  TCP *:40786 (LISTEN)
.....................................省略..........................................

评论(1)

    • 曾伟杰
      昨天看到一个项目经理用的
      lsof -i :8080
      这个端口有一个web程序,我猜测是nginx打开的,然后他直接查是哪些程序占用这个端口,查出来是nginx
      [回复]

评论

名字:
验证码:
获取验证码
内容: