果冻想
认真玩技术的地方

Linux lsof命令详解

前言

最近又忙成狗,顾不上整理博客了。今晚又要上线,趁着这个时间,赶紧写点东西,把这篇文章总结一下吧。说到lsof命令,我第一次见它还是在2015年的3月份,那个时候刚刚入职亚信,给我分配了一个活,就是每天运行一个指定的脚本,统计某个进程打开oracle的连接数,后来看了下脚本,发现里面就是一个简单的lsof命令,那个时候也没有去深究这个lsof到底怎么用,反而到了今天,还要专门写一篇文章来还当初欠下的技术债,哎~~~,废话不多少,下面就开始lsof命令的总结。

命令简介

我们都知道在Linux环境中,文件无处不在,这便产生了一句格言:“任何事物都是文件”。通过文件不仅仅可以访问常规数据,通常还可以访问网络连接和硬件。在有些情况下,当使用ls请求目录清单时,将出现相应的条目。在其他情况下,如传输控制协议 (TCP) 和用户数据报协议 (UDP)套接字,不存在相应的目录清单。但是在后台为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。

因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,所以能够查看这个列表将是很有帮助的。lsof作为Linux下的一个非常实用的系统级的监控、诊断工具,可以很完美的完成这项任务。由于lsof需要访问核心内存和各种文件,所以最好使用root用户运行lsof命令。

命令安装

这是一个很尴尬的事情,这么好用的工具,在很多Linux发行版上居然不是自带的,在CentOS/Fedora/RHEL版本的Linux中则使用下面的命令进行安装。

yum install lsof

命令详解

lsof也是有着最多选项的Linux/Unix命令之一。lsof可以查看打开的文件是:

  • 普通文件
  • 目录
  • 网络文件系统的文件
  • 字符或设备文件
  • (函数)共享库
  • 管道、命名管道
  • 符号链接
  • 网络文件(例如:NFS file、网络socket,unix域名socket)
  • 还有其它类型的文件,等等

虽然lsof命令有着N多的选项,但是常用的只有以下几个:

  • -a:使用AND逻辑,合并选项输出内容
  • -c:列出名称以指定名称开头的进程打开的文件
  • -d:列出打开指定文件描述的进程
  • +d:列出目录下被打开的文件
  • +D:递归列出目录下被打开的文件
  • -n:列出使用NFS的文件
  • -u:列出指定用户打开的文件
  • -p:列出指定进程号所打开的文件
  • -i:列出打开的套接字

使用实例

总的说来,lsof命令还是一个比较复杂的命令,那么多选项,用起来还是蛮累的,但是这不能否定它是一个出色的工具,一个我们不得不学习的命令。下面就来说一些lsof的惯用用法。

  • 命令:lsof
    输出:

    COMMAND     PID   TID    USER   FD      TYPE             DEVICE   SIZE/OFF       NODE NAME
    systemd       1          root  cwd       DIR              253,1       4096          2 /
    systemd       1          root  rtd       DIR              253,1       4096          2 /
    systemd       1          root  txt       REG              253,1    1523568    1053845 /usr/lib/systemd/systemd
    systemd       1          root  mem       REG              253,1      20040    1050452 /usr/lib64/libuuid.so.1.3.0
    systemd       1          root  mem       REG              253,1     261336    1051899 /usr/lib64/libblkid.so.1.1.0
    systemd       1          root  mem       REG              253,1      90664    1050435 /usr/lib64/libz.so.1.2.7
    systemd       1          root  mem       REG              253,1     157424    1050447 /usr/lib64/liblzma.so.5.2.2
    systemd       1          root  mem       REG              253,1      23968    1050682 /usr/lib64/libcap-ng.so.0.0.0
    systemd       1          root  mem       REG              253,1      19888    1050666 /usr/lib64/libattr.so.1.1.0
    

    输出内容详解:

    • COMMAND:进程的名称
    • PID:进程标识符
    • TID:线程标识符
    • USER:进程所有者
    • FD:文件描述符,应用程序通过文件描述符识别该文件,一般有以下取值:
      • cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录
      • txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库
      • lnn:library references (AIX)
      • er:FD information error (see NAME column)
      • jld:jail directory (FreeBSD)
      • ltx:shared library text (code and data)
      • mxx:hex memory-mapped type number xx
      • m86:DOS Merge mapped file
      • mem:memory-mapped file
      • mmap:memory-mapped device
      • pd:parent directory
      • rtd:root directory
      • tr:kernel trace file (OpenBSD)
      • v86:VP/ix mapped file
      • 0:表示标准输出
      • 1:表示标准输入
      • 2:表示标准错误
    • TYPE:文件类型,常见的文件类型有以下几种:
      • DIR:表示目录
      • CHR:表示字符类型
      • BLK:块设备类型
      • UNIX:UNIX域套接字
      • FIFO:先进先出(FIFO)队列
      • IPv4:网际协议(IP)套接字
    • DEVICE:指定磁盘的名称

    • SIZE/OFF:文件的大小
    • NODE:索引节点(文件在磁盘上的标识)
    • NAME:打开文件的确切名称
  • 命令:lsof abc.txt
    说明:显示开启文件abc.txt的进程

  • 命令:lsof -i :80
    说明:列出80端口目前打开的文件列表
    输出:

    COMMAND     PID  USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
    nginx      8838  root    8u  IPv4 114512623      0t0  TCP *:http (LISTEN)
    nginx     12886 jelly    8u  IPv4 114512623      0t0  TCP *:http (LISTEN)
    nginx     12887 jelly    8u  IPv4 114512623      0t0  TCP *:http (LISTEN)
    
  • 命令:lsof -i
    说明:列出所有的网络连接
    输出:

    COMMAND     PID  USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
    ntpd        856   ntp   16u  IPv4     13105      0t0  UDP *:ntp 
    ntpd        856   ntp   17u  IPv6     13106      0t0  UDP *:ntp 
    ntpd        856   ntp   18u  IPv4     13210      0t0  UDP localhost:ntp 
    ntpd        856   ntp   19u  IPv4     13211      0t0  UDP jellythink:ntp 
    vsftpd     1613  root    3u  IPv6     17867      0t0  TCP *:ftp (LISTEN)
    php-fpm    4037 jelly    0u  IPv4  60908335      0t0  TCP localhost:cslistener (LISTEN)
    sshd       8503  root    3u  IPv4    197060      0t0  TCP *:50022 (LISTEN)
    nginx      8838  root    8u  IPv4 114512623      0t0  TCP *:http (LISTEN)
    nginx      8838  root    9u  IPv4 114512624      0t0  TCP *:https (LISTEN)
    php-fpm    9059 jelly    0u  IPv4  60908335      0t0  TCP localhost:cslistener (LISTEN)
    php-fpm    9137 jelly    0u  IPv4  60908335      0t0  TCP localhost:cslistener (LISTEN)
    
  • 命令:lsof -i tcp
    说明:列出所有的TCP网络连接信息

  • 命令:lsof -i udp
    说明:列出所有的UDP网络连接信息

  • 命令:lsof -i tcp:80
    说明:列出80端口TCP协议的所有连接信息

  • 命令:lsof -i udp:25
    说明:列出25端口UDP协议的所有连接信息

  • 命令:lsof -c ngin
    说明:列出以ngin开头的进程打开的文件列表

  • 命令:lsof -p 20711
    说明:列出指定进程打开的文件列表

  • 命令:lsof -u uasp
    说明:列出指定用户打开的文件列表

  • 命令:lsof -u uasp -i tcp
    说明:将所有的TCP网络连接信息和指定用户打开的文件列表信息一起输出

  • 命令:lsof -a -u uasp -i tcp
    说明:将指定用户打开的文件列表信息,同时是TCP网络连接信息的一起输出;注意和上一条命令进行对比

  • 命令:lsof +d /usr/local/
    说明:列出目录下被进程打开的文件列表

  • 命令:lsof +D /usr/local/
    说明:递归搜索目录下被进程打开的文件列表

  • 命令:lsof -i @peida.linux:20,21,22,25,53,80 -r 3
    说明:列出目前连接到主机peida.linux上端口为20,21,22,25,53,80相关的所有文件信息,且每隔3秒不断的执行lsof指令

总结

这快过年了,年底总是少不了一堆的聚餐,这篇文章也写了好久,从12号写到20号,好歹趁着这个周末,把它搞定了。说实话,这个命令我在平时工作中用的还真的比较少,我想,通过这篇总结,以后还真的离不开它了,我的工具箱中也多了一件宝贝,希望我总结的lsof命令对你有帮助,希望你喜欢。

果冻想,认真玩技术的地方。

2019年1月20日,于内蒙古呼和浩特。

赞(11) 打赏
未经允许不得转载:果冻想 » Linux lsof命令详解
关注微信公众号
关注微信公众号和果冻一起分享你的疑惑与心得。
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

玩技术,我们是认真的

联系我们关于果冻

感谢支持果冻想

支付宝扫一扫打赏

微信扫一扫打赏