专栏首页高性能服务器开发做 Java 或者 C++ 开发都应该知道的 lsof 命令

做 Java 或者 C++ 开发都应该知道的 lsof 命令

昨天一位读者在公众号后台约稿,于是有了以下文章,欢迎各位读者约稿,我会认真考虑各位的意见的。

lsof 命令是 Linux 系统的扩展工具,它的含义是 list opened filedesciptor (列出已经打开的文件描述符),在 Linux 系统中,所有的与资源句柄相关的东西都可以统一抽象成文件描述符(filedescriptor,简称 fd)。一个文件句柄是一个 fd,一个 socket 对象也可以称之为 fd 等等。

默认情况下,系统是不存在这个命令的,你需要安装一下,使用如下命令安装:

yum install lsof

我们来看一下这个命令的使用效果:

COMMAND     PID   TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1          root  cwd       DIR              202,1      4096          2 /
nscd        453   469    nscd    8u  netlink                          0t0      11017 ROUTE
nscd        453   470    nscd  cwd       DIR              202,1      4096          2 /
nscd        453   470    nscd  rtd       DIR              202,1      4096          2 /
nscd        453   470    nscd  txt       REG              202,1    180272     146455 /usr/sbin/nscd
nscd        453   470    nscd  mem       REG              202,1    217032     401548 /var/db/nscd/hosts
nscd        453   470    nscd  mem       REG              202,1     90664     132818 /usr/lib64/libz.so.1.2.7
nscd        453   470    nscd  mem       REG              202,1     68192     133155 /usr/lib64/libbz2.so.1.0.6
nscd        453   470    nscd  mem       REG              202,1    153192     133002 /usr/lib64/liblzma.so.5.0.99
nscd        453   470    nscd  mem       REG              202,1     91496     133088 
nscd        453   471    nscd    5u  a_inode                0,9         0       4796 [eventpoll]
nscd        453   471    nscd    6r      REG              202,1    217032     401548 /var/db/nscd/hosts
nscd        453   471    nscd    7u     unix 0xffff880037497440       0t0      11015 /var/run/nscd/socket
nscd        453   471    nscd    8u  netlink                          0t0      11017 ROUTE
imgserver   611       zhangyl  cwd       DIR              202,1      4096    1059054 /home/zhangyl/flamingoserver
imgserver   611       zhangyl  rtd       DIR              202,1      4096          2 /
imgserver   611       zhangyl  txt       REG              202,1   4788917    1057044 /home/zhangyl/flamingoserver/imgserver
imgserver   611       zhangyl   24u  a_inode                0,9         0       4796 [eventfd]
imgserver   611       zhangyl   25u     IPv4           55707643       0t0        TCP *:commtact-http (LISTEN)
imgserver   611       zhangyl   26r      CHR                1,3       0t0       4800 /dev/null
imgserver   611   613 zhangyl   32w      REG              202,1    131072    2754609 /home/zhangyl/flamingoserver/imgcache/258bfb8945288a117d98d440986d7a03

结果显示中列出了各个进程打开的各种 fd 类型,对于 Uinx Socket,lsof 命令会显示出其详细的路径,打开的文件 fd 亦是如此。

使用 lsof 命令有三点需要注意:

  • 默认情况下,lsof 的输出比较多,我们可以使用 grep 命令过滤我们想要查看的进程打开的 fd 信息,如: lsof -i | grep myapp 或者使用 lsof -p pid 也能过滤出指定的进程打开的 fd 信息: [root@iZ238vnojlyZ ~]# lsof -p 26621 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME chatserve 26621 zhangyl cwd DIR 202,1 4096 1059054 /home/zhangyl/flamingoserver chatserve 26621 zhangyl rtd DIR 202,1 4096 2 / chatserve 26621 zhangyl txt REG 202,1 8027035 1051942 /home/zhangyl/flamingoserver/chatserver chatserve 26621 zhangyl mem REG 202,1 61928 141417 /usr/lib64/libnss_files-2.17.so chatserve 26621 zhangyl mem REG 202,1 44096 143235 /usr/lib64/librt-2.17.so chatserve 26621 zhangyl mem REG 202,1 19520 137064 /usr/lib64/libdl-2.17.so chatserve 26621 zhangyl mem REG 202,1 2112384 132824 /usr/lib64/libc-2.17.so chatserve 26621 zhangyl mem REG 202,1 142304 132850 /usr/lib64/libpthread-2.17.so chatserve 26621 zhangyl mem REG 202,1 88720 135291 /usr/lib64/libgcc_s-4.8.5-20150702.so.1 chatserve 26621 zhangyl mem REG 202,1 1141560 137077 /usr/lib64/libm-2.17.so chatserve 26621 zhangyl mem REG 202,1 999944 140059 /usr/lib64/libstdc++.so.6.0.19 chatserve 26621 zhangyl mem REG 202,1 9879756 269001 /usr/lib64/mysql/libmysqlclient.so.20.3.4 chatserve 26621 zhangyl mem REG 202,1 164440 133622 /usr/lib64/ld-2.17.so chatserve 26621 zhangyl 0u CHR 1,3 0t0 4800 /dev/null chatserve 26621 zhangyl 1u CHR 1,3 0t0 4800 /dev/null chatserve 26621 zhangyl 2u CHR 1,3 0t0 4800 /dev/null chatserve 26621 zhangyl 3u a_inode 0,9 0 4796 [eventpoll] chatserve 26621 zhangyl 4u a_inode 0,9 0 4796 [timerfd] chatserve 26621 zhangyl 5u a_inode 0,9 0 4796 [eventfd] chatserve 26621 zhangyl 7u a_inode 0,9 0 4796 [eventpoll]
  • lsof 命令只能查看到当前用户有权限查看到的进程 fd 信息,对于其没有权限的进程,最右边一列会显示 “Permission denied”。如下所示: sshd 26759 root cwd unknown /proc/26759/cwd (readlink: Permission denied) sshd 26759 root rtd unknown /proc/26759/root (readlink: Permission denied) sshd 26759 root txt unknown /proc/26759/exe (readlink: Permission denied) sshd 26759 root NOFD /proc/26759/fd (opendir: Permission denied) bash 26761 root cwd unknown /proc/26761/cwd (readlink: Permission denied) bash 26761 root rtd unknown /proc/26761/root (readlink: Permission denied) bash 26761 root txt unknown /proc/26761/exe (readlink: Permission denied) bash 26761 root NOFD /proc/26761/fd (opendir: Permission denied)
  • lsof 命令第一栏进程名在显示的时候,默认显示前 n 个字符,这样如果我们需要显示完整的进程名以方便过滤的话,可以使用 +c 选项。用法如下: #最左侧的程序名最大显示 15 个字符 [zhangyl@iZ238vnojlyZ ~]$ lsof +c 15 当然,如果你设置值太大, lsof 便不会采用你设置的最大值,而是使用默认最大值。

上文也介绍了,socket 也是一种 fd,如果需要仅显示系统的网络连接信息,使用的是 -i 选项即可,这个选项可以形象地显示出系统当前的出入连接情况:

看到图中的连接方向了吧?

当然,和 netstat 命令一样,lsof -i 默认也会显示 ip 地址和端口号的别名,我们只要使用 -n-P 选项就能相对应地显示 ip 地址和端口号了,综合起来就是 lsof -Pni

本文首发于『easyserverdev』公众号,欢迎关注,转载请保留版权信息。

本文分享自微信公众号 - 高性能服务器开发(easyserverdev),作者:张小方

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 12 经典游戏服务器端架构概述

    现代电子游戏,基本上都会使用一定的网络功能。从验证正版,到多人交互等等,都需要架设一些专用的服务器,以及编写在服务器上的程序。因此,游戏服务器端软...

    范蠡
  • 关于windows完成端口(IOCP)的一些理解(三)

    系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)...

    范蠡
  • 7 QQ游戏百万人同时在线服务器架构实现

    QQ游戏于前几日终于突破了百万人同时在线的关口,向着更为远大的目标迈进,这让其它众多传统的棋牌休闲游戏平台黯然失色,相比之下,联众似乎已经根本不是QQ的对手,因...

    范蠡
  • Django进阶-2-ORM字段

    Django 提供了很多字段类型,比如 URL/Email/IP/ 但是 mysql 数据没有这些类型,这类型存储到数据库上本质是字符串数据类型,主要目的是为了...

    小团子
  • 放心用手机看大图:谷歌图像压缩技术 RAISR,减少压缩带宽 75%

    【新智元导读】 谷歌产品博客今日发文介绍其图像压缩技术RAISR,RAISR于去年11月推出,利用机器学习生成高质量版本的低分辨率图像,使加载每张高清大图片使用...

    新智元
  • Windows成“弃子”,Linux终上位?

    时光倒退二十年,彼时不可一世的微软将开源软件视为眼中钉肉中刺,甚至吐槽其是知识产权的癌症。如今,从“爱 Linux“到豪掷 75 亿美元收购 GitHub,微软...

    三哥
  • 2016谷歌 I/O 开发者大会正式开幕!所有重要信息都在这里

    编辑导语 北京时间5月19日凌晨1点,谷歌 I/O 2016开发者大会在美国旧金山谷歌总部山景城拉开序幕。据悉,这场大会将要进行3天。 一开场,CEOSunda...

    BestSDK
  • windows下nginx的安装使用及解决80端口被占用nginx不能启动的问

    这篇文章主要给大家介绍了关于windows下nginx的安装使用,以及如何解决80端口被占用导致nginx不能启动的问题,文中介绍的非常详细,对大家具有一定的参...

    习惯说一说
  • 【AI白身境】深度学习从弃用windows开始

    很多人会说,Windows不适合写代码?各种各样类似于visual studio的IDE那么牛逼,还不适合写代码?

    用户1508658
  • 想玩集群?读写分离?你要先懂这个!

    答案是:Mysql主从同步,集群,读写分离,都会涉及数据的数据同步,所以想玩哪些东西,我们还是要把这个数据同步的基础学会之后我们才能玩其他的,今...

    思梦php

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动