写点什么

Linux 之 lsof 命令

用户头像
入门小站
关注
发布于: 23 小时前

lsof(list open files)是一个查看当前系统文件的工具。在 linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息。

安装 lsof

Centos


> yum install lsof -y
复制代码


Ubuntu


> sudo apt-get install lsof -y
复制代码

命令格式

lsof [参数][文件]

命令功能

用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof需要访问核心内存和各种文件,所以需要 root 用户执行。

lsof 打开的文件可以是:

  • 1.普通文件

  • 2.目录

  • 3.网络文件系统的文件

  • 4.字符或设备文件

  • 5.(函数)共享库

  • 6.管道,命名管道

  • 7.符号链接

  • 8.网络文件(例如:NFS file、网络 socket,unix 域名 socket)

  • 9.还有其它类型的文件,等等

命令参数

  • -a 列出打开文件存在的进程

  • -c<进程名> 列出指定进程所打开的文件

  • -g 列出 GID 号进程详情

  • -d<文件号> 列出占用该文件号的进程

  • +d<目录> 列出目录下被打开的文件

  • +D<目录> 递归列出目录下被打开的文件

  • -n<目录> 列出使用 NFS 的文件

  • -i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )

  • -p<进程号> 列出指定进程号所打开的文件

  • -u 列出 UID 号进程详情

  • -h 显示帮助信息

  • -v 显示版本信息

列出系统所有打开的文件

> lsof | more
复制代码



会有很多数据, 上面只截取了一部分

字段说明

  • COMMAND:进程的名称

  • PID:进程标识符

  • PPID:父进程标识符(需要指定-R 参数)

  • USER:进程所有者

  • PGID:进程所属组

  • FD:文件描述符,应用程序通过文件描述符识别该文件。如 cwd、txt 等

  • TYPE:文件类型,如 DIR、REG 等,常见的文件类型

  • (1)DIR:表示目录

  • (2)CHR:表示字符类型

  • (3)BLK:块设备类型

  • (4)UNIX: UNIX 域套接字

  • (5)FIFO:先进先出 (FIFO) 队列

  • (6)IPv4:网际协议 (IP) 套接字

  • DEVICE:指定磁盘的名称

  • SIZE:文件的大小

  • NODE:索引节点(文件在磁盘上的标识)

  • NAME:打开文件的确切名称


FD 说明


查看/bin/bash被谁占用

> lsof /bin/bash
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEbash 14443 root txt REG 253,1 960392 140072 /usr/bin/bash
复制代码

递归查看当前目录文件信息

> lsof .
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEbash 14443 root cwd DIR 253,1 4096 131073 .lsof 16522 root cwd DIR 253,1 4096 131073 .lsof 16523 root cwd DIR 253,1 4096 131073 .
复制代码


子目录文件占用情况也显示出来


> lsof +D .COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAMEbash      14443 root  cwd    DIR  253,1     4096 131073 .lsof      16426 root  cwd    DIR  253,1     4096 131073 .lsof      16427 root  cwd    DIR  253,1     4096 131073 .YDService 17532 root   27r   REG  253,1    79613 131087 ./.bash_history
复制代码


不使用+D 选项,遍历查看某个目录的所有文件信息的方法


> lsof | grep "rumenz/temp"
复制代码

列出某个用户打开的文件信息

> lsof -u root | more
复制代码



-u 选项,u 其实是 user 的缩写

列出某个程序进程所打开的文件信息

> lsof -c mysql
复制代码


列出多个进程多个打开的文件信息

> lsof -c mysql nginx
复制代码

列出除了某个用户外的被打开的文件信息

> lsof -u ^root
复制代码

通过某个进程号显示该进行打开的文件

> lsof -p 123
复制代码

列出多个进程号对应的文件信息

> lsof -p 123,456,789
复制代码

列出除了某个进程号,其他进程号所打开的文件信息

> lsof -p ^123
复制代码

列出所有的网络连接

> lsof -i
复制代码


列出谁在使用某个端口

> lsof -i :3306
复制代码

同时指定多个端口

> lsof -i :3306,80
复制代码

列出谁在使用某个特定的 udp 端口

> lsof -i udp:123
复制代码

特定的 tcp 端口

> lsof -i tcp:80
复制代码

列出所有 tcp 网络连接信息

> lsof -i tcp
复制代码

列出所有 udp 网络连接信息

> lsof -i tcp
复制代码

列出某个用户的所有活跃的网络端口

> lsof -a -u root -i
复制代码

列出所有网络文件系统

> lsof -N
复制代码

列出 COMMAND 列中包含字符串" sshd",且文件描述符的类型为 txt 的文件信息

> lsof -c sshd -a -d txtCOMMAND   PID USER  FD   TYPE DEVICE SIZE/OFF   NODE NAMEsshd     4400 root txt    REG  253,1   823744 143872 /usr/sbin/sshdsshd    14432 root txt    REG  253,1   823744 143872 /usr/sbin/sshd
复制代码

列出被进程号为 123 的进程所打开的所有 IPV4 network files

> lsof -i 4 -a -p 123
复制代码


-i 4代表的是IPV4,-i 6代表的是IPV6

某个用户组所打开的文件信息

> lsof -g 123
复制代码

根据文件描述列出对应的文件信息

> lsof -d txt> lsof -d 1> lsof -d 2
复制代码


0 表示标准输入,1 表示标准输出,2 表示标准错误,从而可知:所以大多数应用程序所打开的文件的 FD 都是从 3 开始

根据文件描述范围列出文件信息

> lsof -d 1-2
复制代码


原文链接:https://rumenz.com/rumenbiji/linux-lsof.html微信公众号:入门小站

发布于: 23 小时前阅读数: 4
用户头像

入门小站

关注

还未添加个人签名 2020.01.18 加入

还未添加个人简介

评论

发布
暂无评论
Linux之lsof命令