• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >Linux > Linux lsof命令使用详解

Linux lsof命令使用详解

作者:sparkdev 字体:[增加 减小] 来源:互联网

本文主要包含Linux,lsof命令,Linux,lsof等服务器相关知识,sparkdev 希望可以进行参考

lsof(list open files)是一个查看进程打开的文件的工具。

在 linux 系统中,一切皆文件。通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以 lsof 命令不仅可以查看进程打开的文件、目录,还可以查看进程监听的端口等 socket 相关的信息。本文将介绍 lsof 命令的基本用法,本文中 demo 的演示环境为 ubuntu 18.04。

常用选项

-a 指示其它选项之间为与的关系
-c <进程名> 输出指定进程所打开的文件
-d <文件描述符> 列出占用该文件号的进程
+d <目录> 输出目录及目录下被打开的文件和目录(不递归)
+D <目录> 递归输出及目录下被打开的文件和目录
-i <条件> 输出符合条件与网络相关的文件
-n 不解析主机名
-p <进程号> 输出指定 PID 的进程所打开的文件
-P 不解析端口号
-t 只输出 PID
-u 输出指定用户打开的文件
-U 输出打开的 UNIX domain socket 文件
-h 显示帮助信息
-v 显示版本信息

基本输出

如果不带任何选项执行 lsof 命令,会输出系统中所有 active 进程打开的所有文件,结果就是我们被输出的信息所淹没,这没有任何的意义。我们先让 lsof 命令输出当前 Bash 进程打开的文件,并截取其中的一部分结果来介绍输出内容中都包含哪些信息:

COMMAND:程序的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件
TYPE:文件类型,如 DIR、REG 等
DEVICE:以逗号分隔设备编号
SIZE:文件的大小(bytes)
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

下面简单介绍一下 FD 列和 TYPE 列中的常见内容。
FD 列中的常见内容有 cwd、rtd、txt、mem 和一些数字等等。其中 cwd 表示当前的工作目录;rtd 表示根目录;txt 表示程序的可执行文件;mem 表示内存映射文件:

还有一部分 FD 是以数字表示的,比如标准输入输出文件:

数字后面的字母表示进程对该文件的读写模式,比如上图中的 u 表示该文件被打开并处于读取/写入模式。除了 u,还有 r 表示只读模式,w 表示只写模式,还可以同时应用 W 表示该进程拥有对文件写操作的锁。下图是截取的 docker daemon 进程打开的文件列表,其中显示了 FD 的不同模式:

TYPE 列中常见的 REG 和 DIR 分别表示普通文件和目录。而 CHR 和 BLK 则分别表示字符和块设备,unix、fifo 和 IPv4/IPv6 分别表示 UNIX domain 套接字、先进先出(FIFO)队列和 IPv4/IPv6 套接字。

下面我们来介绍一些 lsof 命令的常见用法。

查看哪些进程打开了某个文件

直接指定文件的名称作为 lsof 的参加就可以查看哪些进程打开了这个文件,下面的命令查询打开了 /bin/bash 文件的进程:

$ sudo lsof /bin/bash

除了普通文件,也可以是设备等文件(下面命令的输出很长,图示只是截取的一小部分):

$ sudo lsof /dev/sda1

查看哪些进程打开了某个目录及目录下的文件

这里分两种情况,+d 选项不执行递归查询,只查找那些打开了指定目录以及指定目录下文件和目录的进程,比如:

$ sudo lsof +d /var/log

而 +D 选项则会对指定的目录进行递归:

$ sudo lsof +D /var/log

在卸载文件系统时,如果有进程打开了该文件系统中的文件或目录,卸载操作就会失败。因此最好在卸载文件系统前通过 lsof +D 检查文件系统的挂载点,杀掉相关的进程然后再执行卸载操作。

查看某个进程打开的所有文件

通过 -p 选项并指定进程的 PID 可以输出该进程打开的所有文件。比如我们想要查看 cron 程序打开的文件,可以先用 ps -C cron 命令查出进程的 PID:

然后把该 PID 传递给 lsof 命令的 -p 选项:

$ sudo lsof -p 1152

组合多个选项

如果为 lsof 命令指定多个选项,这些选项间默认是或的关系。也就是说满足任何一个选项的结果都会被输出。可以添加额外的 -a 选项,它的作用就是让其它选项之间的关系变为与,比如下面的命令:

$ sudo lsof -a -p $$ -d0,1,2

其中的 -p 选项指定了当前进程的 PID,而 -d 选项则用来指定进程打开的文件描述符(可以通过逗号分隔多个文件描述符)。添加 -a 选项后,结果输出为当前进程打开的文件描述符为 0、1、2 的文件。
说明,-a 选项的使用有很多条件,具体请参考 lsof man page。

查看指定名称的程序打开的文件

通过 -c 选项可以匹配进程运行的程序(可执行文件)名称。比如我们要查找以字母 cr 开头的程序打开的文件列表:

$ sudo lsof -c cr

还可以同时指定多个 -c 选项,它们之间是或的关系。
如果想对 -c 选项的条件取反,只要在字符串前添加符号 ^ 就可以了,比如:

$ sudo lsof -c ^cr

-c 选项也支持正则表达式,比如下面的命令可以过滤出以 cra 和 cro 开头的程序打开的文件:

$ sudo lsof -c /cr[ao]/

查看被打开的与网络相关的文件

-i 选项用来查看被打开的和网络相关的文件,其参数的格式如下:
[46][protocol][@hostname|hostaddr][:service|port]
46 表示 IP 协议的版本
protocol 表示网络协议的名称,比如 TCP 或 UDP
hostname 或 hostaddr 表示主机地址
service 指 /etc/services 中的名称,比如 smtp 或多个服务的列表
port 表示端口号,可以指定一个或多个

-i 选项默认会同时输出 IPv4 和 IPv6 打开的文件:

$ sudo lsof -i

只列出 IPv4 或 IPv6 打开的文件

$ sudo lsof -i 4
$ sudo lsof -i 6

列出与 22 号端口相关的文件

$ sudo lsof -i:22

列出指定范围内被打开的 TCP 端口

$ sudo -i TCP:1-1024

查看被打开的 UNIX domain socket 文件

-U 选项输出打开的 UNIX domain socket 文件,这里我们结合 -c 选项来查看 ssh 服务打开的 UNIX domain socket 文件:

$ sudo lsof -a -c sshd -U

查看某个用户打开的所有文件

-u 选项可以指定用户名或 user ID,并且和 -c 选项一样,可以通过逗号分隔多个用户名称或 user ID,也可以通过符号 ^ 对条件取反。
查看某个用户打开的所有文件

$ sudo lsof -u syslog

查

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Linux之删除带有空格的文件(不是目录)
  • linux 服务器自动备份脚本的方法(mysql、附件备份)
  • 解决linux环境下时区无法设置的问题
  • 解决Linux+Apache服务器URL区分大小写问题
  • Linux lsof命令使用详解
  • 使用vs2019进行Linux远程开发的方法步骤
  • Linux修改主机名的简单方法
  • Linux系统(CentOS7安装)安装JDK8的教程详解
  • Centos7下安装apache过程总结
  • centos7安装配置vsftp

相关文章

  • Linux centos7 下安装 phpMyAdmin的教程
  • Centos7中Nginx开机自启动的解决办法
  • CentOS7上安装MySQL Workbench
  • centos7 mariadb主从复制配置搭建
  • nginx TCP 转发配置
  • Linux修改主机名的简单方法
  • CentOS 删除MySQL
  • centos 搭建dns服务器 解析任意域名
  • centos下Nginx配置指南
  • Centos 6.8上安装Mysql 5.6.35

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • DotNet Run 命令介绍
    • Linux系统(CentOS7安装)安装JDK8的教程详解
    • Windows 10 下安装 Apache 2.4.41的教程
    • CentOS7最小安装mysql
    • Ubuntu启用VNC服务的配置
    • CentOS下安装redis和redis集群
    • centos7安装nginx的两种方法
    • CentOS7安装MySQL5.6.28及其修改密码
    • centos服务器搭建ntp服务
    • docker安装tomcat dubbo-admin实例技巧

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有