[转帖]linux lsof 命令使用指南

linux,lsof,命令,使用指南 · 浏览次数 : 0

小编点评

**lsof简介** `lsof` 是一个命令行工具,用于显示系统中打开的文件。它可以查看文件和进程的信息,包括: * 文件描述符 (FD) * 文件类型 (TYPE) * 文件所在设备 * 文件大小 * 进程 ID (PID) * 用户名 (USER) * 文件打开时间 **常用参数** `lsof` 有许多选项,可以用来过滤和筛选文件和进程。以下是一些常见参数: * `-a`:显示所有文件和进程,而不是仅显示打开的文件。 * `-c`:只显示特定的文件类型。 * `-d`:递归地遍历子目录。 * `-D`:仅显示目录名。 * `-e`:显示文件和进程的路径。 * `-f`:显示文件详细信息,包括大小、类型、打开时间等。 * `-g`:只显示可读的文件。 * `-i`:显示网络连接信息。 * `-k`:显示进程的亲属关系。 * `-L`:显示文件打开的端口。 * `-m`:显示进程的内存使用情况。 * `-M`:显示所有打开文件的详细信息。 * `-o`:显示打开文件的打开方式。 * `-p`:只显示与特定进程相关的文件。 * `-r`:只显示正在运行的进程。 * `-s`:只显示文件大小。 * `-S`:只显示文件大小。 * `-T`:只显示打开文件的超时时间。 * `-u`:显示所有用户打开的文件。 * `-w`:只显示打开文件的路径。 * `-x`:只显示打开文件的类型。 * `-z`:只显示打开文件的设备名称。 * `--`:表示选项的后面必须以字符 `--`结束。 **示例命令** 以下命令显示了所有打开的 TCP 端口: ``` sudo lsof -i TCP ``` **其他资源** * `lsof manpage`:提供有关 `lsof` 命令的详细参数和选项。 * `An lsof Primer`:这是一个介绍 `lsof` 命令的教程。

正文

https://cizixs.com/2017/05/16/linux-lsof-primer/

  

lsof 简介

lsof 是 list open files 的简称,正如名字所示,它的作用主要是列出系统中打开的文件。乍看起来,这是个功能非常简单,使用场景不多的命令,不过是 ls 的另一个版本。但是因为 unix 系统的 everything is a file 的哲学,基本上 *nix 系统所有的对象都可以看做对象,再加上这个命令提供的各种参数,使得它其实非常强大,能够轻松地获得很多非常有用的信息,有些用其他工具会非常麻烦。

lsof 可以知道用户和进程操作了哪些文件,也可以查看系统中网络的使用情况,以及设备的信息。它的参数也非常多,manoage 显示的使用方法如下,这篇文章会介绍比较常见的使用方法。

lsof  [ -?abChKlnNOPRtUvVX ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ] [ +|-D D ] [ +|-e s ] [ +|-f [cfgGn] ] [ -F [f] ] [ -g [s] ] [ -i [i] ] [ -k k ] [ +|-L [l] ] [ +|-m m ] [
       +|-M ] [ -o [o] ] [ -p s ] [ +|-r [t[m<fmt>]] ] [ -s [p:s] ] [ -S [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x [fl] ] [ -z [z] ] [ -Z [Z] ] [ -- ] [names]

直接运行 lsof,不使用任何的参数,会列出系统中所有的打开文件,每个文件一行。

➜  ~ sudo lsof | head
COMMAND     PID   TID             USER   FD      TYPE             DEVICE    SIZE/OFF       NODE NAME
systemd       1                   root  cwd       DIR               8,18        4096          2 /
systemd       1                   root  rtd       DIR               8,18        4096          2 /
systemd       1                   root  txt       REG               8,18     1577232    5247327 /lib/systemd/systemd
systemd       1                   root  mem       REG               8,18       18976    5247628 /lib/x86_64-linux-gnu/libuuid.so.1.3.0
systemd       1                   root  mem       REG               8,18      262408    5247436 /lib/x86_64-linux-gnu/libblkid.so.1.1.0
systemd       1                   root  mem       REG               8,18       14608    5250746 /lib/x86_64-linux-gnu/libdl-2.23.so

上面的输入每列的内容分别是:命令名称,进程 id、用户名、FD、文件类型、文件所在的设备、文件大小或者所在设备的偏移量、node/inode 编号、文件名。我们来介绍一下几个比较不那么容易理解的项,FD(file descriptor)表示文件描述符或者文件的描述,包括:

  • cwd:当前工作目录
  • mem:内存映射文件
  • mmap:内存映射设备
  • txt:应用文本(代码和数据)
  • ……

TYPE 表示文件的类型,比如:

  • IPv4:IPv4 socket
  • IPv6:IPv6 socket
  • inet:Internet Domain Socket
  • unix:unix domain socket
  • BLK:设备文件
  • CHR:字符文件
  • DIR:文件夹
  • FIFO:FIFO 文件
  • LINK:符号链接文件
  • REG:普通文件
  • ……

更多的选项可以参考 lsof manpage。

NOTE: 请使用 sudo 或者 root 用户来运行 lsof,以便查看所有的打开文件。

文件和进程信息

列出某个进程打开的所有文件

sudo lsof -p 1190

列出某个用户打开的文件

sudo lsof -u cizixs

也可以取反,列出所有不是某个用户打开的文件,只要在用户名之前加上 ^ 符号:

sudo lsof -u ^cizixs

列出某个文件被哪些进程打开(使用)

sudo lsof /path/to/file

列出访问某个目录的所有进程

sudo lsof +d /path/to/dir/

这个命令并不会递归地去访问子目录,如果想做到这一点,可以使用 +D

sudo ls +D /var/log/apache/

列出某个命令使用的文件信息

sudo lsof -c nginx

-c 参数后面跟着命令的开头字符串,不一定是具体的程序名称,比如 sudo lsof -c n 也是合法的,会列出所有名字开头字母是 n 的程序打开的文件信息。

这个命令虽然没有 -p 查看某个进程更直接,但是对于不能直接查到进程号,或者程序包含多个进程的场景还是有用的。

网络信息

lsof 另一个比较常用的功能是查看网络信息,虽然有 netstat 这个专门的工具,但是 lsof 有时候会更方便,比如查看某个端口的使用情况。

列出所有的网络连接信息

sudo lsof -i 

只显示 TCP 或者 UDP 连接

在 -i 后面直接跟着协议的类型(TCP 或者 UDP)就能只显示该网络协议的连接信息:

sudo lsof -i TCP

查看某个端口的网络连接情况

这个命令非常常用,一般要运行服务的时候发现网络冲突,或者需要了解某个端口被哪个进程使用的时候非常方便:

sudo lsof -i :80

查看连接到某个主机的网络情况

sudo lsof -i @172.16.1.14

端口和主机还可以放在一起使用,表示连接到某个主机特定端口的网络情况:

sudo lsof -i @172.16.1.14:22

列出当前机器监听的端口

sudo lsof -i -s TCP:LISTEN

-s p:s 参数跟着两个字段:协议和状态,中间用冒号隔开。比如这里 TCP:LISTEN 表示处于监听状态的 TCP 协议,类似的,你也可以查看处于已连接的 TCP 网络:

sudo lsof -i -s TCP:ESTABLISHED

组合用法

lsof 的过滤参数是可以组合起来的,但是默认情况下是 OR 逻辑,也就是会列出所有过滤条件的总和。可以使用 -a 参数告诉 lsof 列出同时满足所有条件的结果,比如列出某个进程监听的所有网络连接:

sudo lsof -a -p 12345 -i -s TCP:LISTEN

参考资料

与[转帖]linux lsof 命令使用指南相似的内容:

[转帖]linux lsof 命令使用指南

https://cizixs.com/2017/05/16/linux-lsof-primer/ lsof 简介 lsof 是 list open files 的简称,正如名字所示,它的作用主要是列出系统中打开的文件。乍看起来,这是个功能非常简单,使用场景不多的命令,不过是 ls 的另一个版本。但是

[转帖]Linux 命令神器:lsof

lsof是系统管理/安全的管理工具。将这个工具称之为lsof真实名副其实,因为它是指“列出打开文件(lists openfiles)”。而有一点要切记,在Unix中一切(包括网络套接口)都是文件。 有趣的是,lsof也是有着最多开关的Linux/Unix命令之一。它有那么多的开关,它有许多选项支持使

[转帖]Linux命令拾遗-软件资源观测

原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 这是Linux命令拾遗系列的第三篇,本篇主要介绍Linux中观测软件资源的命令,如ps、netstat、lsof,以及查看进程信息的宝库/proc目录。 本系列文章索引Linux命令拾遗-入门篇Linux命令拾遗

[转帖]lsof命令

https://www.cnblogs.com/ryanlamp/p/10797641.html lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议

[转帖] Linux命令拾遗-软件资源观测

https://www.cnblogs.com/codelogs/p/16060443.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 这是Linux命令拾遗系列的第三篇,本篇主要介绍Linux中观测软件资源的命令,如ps、netstat、lsof,

[转帖]linux下df查看空间已经占用%100,但是找不到大文件的解决方法

https://www.cnblogs.com/leffss/p/8571685.html 有时候在linux下会遇到这种情况:df查看空间已经占用%100,但是找不到大文件,怎么回事呢,经过网上查找资料,得到解决方法: 1.使用lsof查看已删除但未释放的文件 lsof -n | grep del

【转帖】linux 内核分析工具 Dtrace、SystemTap、火焰图、crash等

<< System语言详解 >> 关于 SystemTap 的书。 我们在分析各种系统异常和故障的时候,通常会用到 pstack(jstack) /pldd/ lsof/ tcpdump/ gdb(jdb)/ netstat/vmstat/ mpstat/truss(strace)/iostat/s

[转帖]Linux 磁盘I/O 调度算法 说明

2022-08-23 13:031361转载Linux 1 Linux 4.0 IO协议栈框架图 I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。 Linux 4.0 IO协议栈框架图 I/O调度程序的总结 当向

[转帖]Linux中常见IO调度器

https://www.jianshu.com/p/3c16e39a005a 单队列调度算法多队列调度算法 deadline mqdeadlines cfq bfq noop none kyber 对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字是

[转帖]Linux 平台使用shc 工具加密shell 脚本

2021-08-03 20:4510030原创Linux 本文链接:https://www.cndba.cn/dave/article/4642 1 shc 工具说明 shell 脚本是常用脚本,运维中经常使用,但有时候在shell 脚本中会包含一些敏感的信息,比如密码或者特殊的参数,此时我们就可以