Linux命令 -- lsof

版权声明:欢迎关注公众号「Golang来了」交流。文章若有不妥之处请指正,欢迎转载,不过须注明出处~ https://blog.csdn.net/asd1126163471/article/details/73565234

简介

lost(list open files) 是一个列出当前系统打开文件的工具。
先来一段简单的介绍:
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。 注意:这里的“文件”不单指一般的文件,还包括目录、socket套接字、设备文件和命名管道。
因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof 命令可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
我们可以直接在命令行键入 lsof -h 直接获取帮助。

直接键入 lsof | more (因为输出太多行,我们使用more)

COMMAND     PID      USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
init          1      root  cwd       DIR              252,1     4096          2 /
init          1      root  rtd       DIR              252,1     4096          2 /
init          1      root  txt       REG              252,1   150352    3014667 /sbin/init
init          1      root  mem       REG              252,1    39896     262251 /lib64/libnih-dbus.so.1.0.0
init          1      root  mem       REG              252,1   101920     262253 /lib64/libnih.so.1.0.0
init          1      root  mem       REG              252,1   154664     262147 /lib64/ld-2.12.so
init          1      root    0u      CHR                1,3      0t0       3787 /dev/null
init          1      root    1u      CHR                1,3      0t0       3787 /dev/null
init          1      root    2u      CHR                1,3      0t0       3787 /dev/null
init          1      root    3r     FIFO                0,8      0t0       6543 pipe
init          1      root    4w     FIFO                0,8      0t0       6543 pipe
init          1      root    5r      DIR               0,10        0          1 inotify
init          1      root    6r      DIR               0,10        0          1 inotify

说明:
lsof输出各列的信息意义如下

  • COMMAND 进程名称(与文件相关联的进程名称)
  • PID 进程id
  • PPID 父进程标识符(需要指定-R参数)
  • PGID 进程所属组(lsof -g 进程id)
  • USER 拉起进程的用户
  • FD 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt、数字等
  • TYPE 文件类型,如DIR、REG等
  • DEVICE 指示文件所在设备的设备号(major,minor)
  • SIZE/OFF 指示文件的大小或进程对文件操作的偏移量
  • NODE 索引节点(文件在磁盘上的标识)
  • NAME 文件名

FD列常见的取值如下:
cwd:进程工作目录
txt:进程由该程序拉起
rtd:进程的根目录
mem:内存映射文件
N(u/w/r):指示该文件为进程打开的第N个文件描述符,u为可读可写模式,w为可写模式,r为可读模式(linux操作系统已经把0、1、2文件描述符分配给了标准输入、输出和错误流,所以大多数应用程序打开的文件的FD都是从3开始的)。
TYPE常见的类型如下:
REG :一般文件
DIR:目录
CHR :字符类型
UNIX: UNIX 域套接字
FIFO:命名管道(先进先出队列)
PIPE:管道
IPv4:网际协议 (IP) 套接字
根据以上字段,我们就可以了解到哪个文件以何种关联方式与哪个进程关联。

常用参数

lsof filename      显示开启文件filename的进程
lsof -c filename(进程名称)    显示进程filename打开的所有文件
lsof -p 123        显示进程号为123的进程打开的所有文件
lsof -g gid        显示归属gid的进程情况
lsof +d /usr/local/     显示目录下被进程开启的文件
lsof +D /usr/local/    同上,但是会搜索目录下的目录,时间较长
lsof -d 4       显示使用fd为4的进程
lsof -i:80      显示所有打开80端口的进程
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
  46 --> IPv4 or IPv6
  protocol --> TCP or UDP
  hostname --> Internet host name
  hostaddr --> IPv4地址
  service --> /etc/service中的 service name (可以不止一个)
  port --> 端口号 (可以不止一个)

示例

1、查看打开文件/dev/ptmx的进程

[root@dev-103 dev]# lsof /dev/ptmx
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    23017 root    8u   CHR    5,2      0t0 5359 /dev/ptmx
sshd    23017 root   10u   CHR    5,2      0t0 5359 /dev/ptmx
sshd    23017 root   11u   CHR    5,2      0t0 5359 /dev/ptmx
sshd    23180 root    8u   CHR    5,2      0t0 5359 /dev/ptmx
sshd    23180 root   10u   CHR    5,2      0t0 5359 /dev/ptmx
sshd    23180 root   11u   CHR    5,2      0t0 5359 /dev/ptmx
sshd    23211 root    8u   CHR    5,2      0t0 5359 /dev/ptmx
sshd    23211 root   10u   CHR    5,2      0t0 5359 /dev/ptmx
sshd    23211 root   11u   CHR    5,2      0t0 5359 /dev/ptmx
sshd    27590 root    8u   CHR    5,2      0t0 5359 /dev/ptmx
sshd    27590 root   10u   CHR    5,2      0t0 5359 /dev/ptmx
sshd    27590 root   11u   CHR    5,2      0t0 5359 /dev/ptmx

2、查看进程server打开的文件

[root@dev-103 dev]# lsof -c server
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
server  27298 root  cwd    DIR  252,1     4096   1547 /data/test/socketecho
server  27298 root  rtd    DIR  252,1     4096      2 /
server  27298 root  txt    REG  252,1     9677    881 /data/test/socketecho/server
server  27298 root  mem    REG  252,1  1920936 262157 /lib64/libc-2.12.so
server  27298 root  mem    REG  252,1   154664 262147 /lib64/ld-2.12.so
server  27298 root    0u   CHR 136,10      0t0     13 /dev/pts/10
server  27298 root    1u   CHR 136,10      0t0     13 /dev/pts/10
server  27298 root    2u   CHR 136,10      0t0     13 /dev/pts/10
server  27298 root    3u  IPv4 346525      0t0    TCP *:muse (LISTEN)
server  27298 root    4u  IPv4 346526      0t0    TCP localhost:muse->localhost:44422 (ESTABLISHED)

3、查看pid为27298的进程打开的文件

[root@dev-103 dev]# lsof -p 27298
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
server  27298 root  cwd    DIR  252,1     4096   1547 /data/test/socketecho
server  27298 root  rtd    DIR  252,1     4096      2 /
server  27298 root  txt    REG  252,1     9677    881 /data/test/socketecho/server
server  27298 root  mem    REG  252,1  1920936 262157 /lib64/libc-2.12.so
server  27298 root  mem    REG  252,1   154664 262147 /lib64/ld-2.12.so
server  27298 root    0u   CHR 136,10      0t0     13 /dev/pts/10
server  27298 root    1u   CHR 136,10      0t0     13 /dev/pts/10
server  27298 root    2u   CHR 136,10      0t0     13 /dev/pts/10
server  27298 root    3u  IPv4 346525      0t0    TCP *:muse (LISTEN)
server  27298 root    4u  IPv4 346526      0t0    TCP localhost:muse->localhost:44422 (ESTABLISHED)

4、查看使用端口6888的进程

[root@dev-103 dev]# lsof -i:6888
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
server  27298 root    3u  IPv4 346525      0t0  TCP *:muse (LISTEN)
server  27298 root    4u  IPv4 346526      0t0  TCP localhost:muse->localhost:44422 (ESTABLISHED)
client  27638 root    3u  IPv4 347811      0t0  TCP localhost:44422->localhost:muse (ESTABLISHED)

5、列出使用FD为4的所有进程

[root@dev-103 ~]# lsof -d 4

COMMAND     PID      USER   FD   TYPE             DEVICE SIZE/OFF       NODE NAME
init          1      root    4w  FIFO                0,8      0t0       6543 pipe
master     1138      root    4u   CHR                1,3      0t0       3787 /dev/null
qmgr       1153   postfix    4w  FIFO                0,8      0t0       9295 pipe
php-fpm    1155      root    4w   REG              252,1   620778    2359313 /data/logs/php-fpm/error.log
crond      1492      root    4u  unix 0xffff88003bbaaac0      0t0      11390 socket
salt-mini  1561      root    4r   CHR                1,9      0t0       3792 /dev/urandom
pickup     6927   postfix    4w  FIFO                0,8      0t0       9295 pipe
sshd       7804      root    4w  unix 0xffff88001202f440      0t0     410458 socket
server     7863      root    4u  IPv4             415008      0t0        TCP localhost:muse->localhost:44457 (ESTABLISHED)
cleanup    8072   postfix    4w  FIFO                0,8      0t0       9295 pipe
local      8074   postfix    4w  FIFO                0,8      0t0       9295 pipe

以上只是介绍了lsof的常见用法,欢迎大家提供更好的使用方法。

参考
1、http://www.cnblogs.com/bangerlee/archive/2012/05/03/2464495.html
2、http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316599.html
3、http://blog.csdn.net/Linux_ever/article/details/50789199
4、http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/lsof.html

猜你喜欢

转载自blog.csdn.net/asd1126163471/article/details/73565234