Linux中的lsof

lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

选项

选项 描述
-a 列出打开文件存在的进程;
-c<进程名> 列出指定进程所打开的文件;
-g 列出GID号进程详情;
-d<文件号> 列出占用该文件号的进程;
+d<目录> 列出目录下被打开的文件;
+D<目录> 递归列出目录下被打开的文件;
-n<目录> 列出使用NFS的文件;
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件;
-u 列出UID号进程详情;
-h 显示帮助信息;
-v 显示版本信息。

如果不带任何选项执行 lsof 命令,会输出系统中所有 active 进程打开的所有文件,结果就是我们被输出的信息所淹没,这没有任何的意义。由于输出内容太多,这里只取前十行作为示例,如下:

[root@centos7 ~]# lsof |sed -n '1,10p'
COMMAND   PID TID USER   FD   TYPE        DEVICE  SIZE/OFF      NODE NAME
systemd    1       root  cwd  DIR         253,0       224         64 /
systemd    1       root  rtd  DIR         253,0       224         64 /
systemd    1       root  txt  REG         253,0   1632776   34111359 /usr/lib/systemd/systemd
systemd    1       root  mem  REG         253,0     20064   33612035 /usr/lib64/libuuid.so.1.3.0
systemd    1       root  mem  REG         253,0    265576   33930342 /usr/lib64/libblkid.so.1.1.0
systemd    1       root  mem  REG         253,0     90248   33612015 /usr/lib64/libz.so.1.2.7
systemd    1       root  mem  REG         253,0    157424   33612020 /usr/lib64/liblzma.so.5.2.2
systemd    1       root  mem  REG         253,0     23968   33612146 /usr/lib64/libcap-ng.so.0.0.0
systemd    1       root  mem  REG         253,0     19896   33612136 /usr/lib64/libattr.so.1.1.0

可以看到输出内容中都包含这些信息:

COMMAND 进程的名称
PID 进程标识符
PPID 父进程标识符(需要指定-R参数)
USER 进程所有者
PGID 进程所属组
FD 文件描述符,应用程序通过文件描述符识别该文件。
DEVICE 指定磁盘的名称
SIZE 文件的大小
NODE 索引节点(文件在磁盘上的标识)
NAME 打开文件的确切名称

下面简单介绍一下 FD 列和 TYPE 列中的常见内容。
FD 列中的常见内容有 cwd、rtd、txt、mem 和一些数字等等。其中 cwd 表示当前的工作目录;rtd 表示根目录;txt 表示程序的可执行文件;mem 表示内存映射文件;还有一部分 FD 是以数字表示的,比如标准输入输出文件:数字后面的字母表示进程对该文件的读写模式,比如上图中的 u 表示该文件被打开并处于读取/写入模式。除了 u,还有 r 表示只读模式,w 表示只写模式,还可以同时应用 W 表示该进程拥有对文件写操作的锁。下图是截取的 docker daemon 进程打开的文件列表,其中显示了 FD 的不同模式:

docker-co  19350 19941    root    0r      CHR                1,3       0t0       7516 /dev/null
docker-co  19350 19941    root    1u     unix 0xffff97f6356ed940       0t0     131546 socket
docker-co  19350 19941    root    2u     unix 0xffff97f6356ed940       0t0     131546 socket
docker-co  19350 19941    root    3u     unix 0xffff97f6356e9980       0t0     131548 /var/run/docker/libcontainerd/docker-containerd.sock
docker-co  19350 19941    root    4u  a_inode               0,10         0       7512 [eventpoll]
docker-co  19350 19941    root    5u  a_inode               0,10         0       7512 [eventpoll]
docker-co  19350 19941    root    6w      REG               0,20      1604     102553 /run/docker/libcontainerd/containerd/events.log
docker-co  19350 19941    root    7u     unix 0xffff97f62a61d0c0       0t0     131551 /var/run/docker/libcontainerd/docker-containerd.sock

FD文件描述符列表

cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnn:library references (AIX)(库引用);
er:FD information error (see NAME column)(fd信息错误);
jld:jail directory (FreeBSD)(监控目录);
ltx:shared library text (code and data)(共享库文本);
mxx :hex memory-mapped type number xx(十六进制内存映射类型号xx);
m86:DOS Merge mapped file(DOS合并映射文件);
mem:memory-mapped file(内存映射文件);
mmap:memory-mapped device(内存映射设备);
pd:parent directory(父目录);
rtd:root directory(跟目录);
tr:kernel trace file (OpenBSD)(内核跟踪文件);
v86 VP/ix mapped file(VP/IX映射文件);
0:表示标准输出
1:表示标准输入
2:表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:
u:表示该文件被打开并处于读取/写入模式。
r:表示该文件被打开并处于只读模式。
w:表示该文件被打开并处于。
空格:表示该文件的状态模式为unknow,且没有锁定。
-:表示该文件的状态模式为unknow,且被锁定。

同时在文件状态模式后面,还跟着相关的锁:

N:for a Solaris NFS lock of unknown type(对于未知类型的Solaris NFS锁);
r:for read lock on part of the file(用于对文件的一部分进行读取锁定);
R:for a read lock on the entire file(整个文件的读取锁定);
w:for a write lock on part of the file;(文件的部分写锁)
W:for a write lock on the entire file;(整个文件的写锁)
u:for a read and write lock of any length(对于任意长度的读写锁);
U:for a lock of unknown type(对于未知类型的锁);
x:for an SCO OpenServer Xenix lock on

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux系统lsof命令用于查看进程打开的文件、目录以及进程监听的端口等socket相关的信息。通过lsof命令,我们可以了解到进程与文件之间的关系,包括哪些进程正在使用某个文件系统。 常见的lsof命令选项包括: - lsof file:显示已打开该文件的进程 - lsof -c abc:显示进程名为abc的进程当前打开的文件 - lsof -cp 1234:列出进程号为1234的进程所打开的文件 - lsof -g gid:显示归属于gid的进程情况 - lsof -d 4:显示文件描述符为4的进程 - lsof -i:显示符合条件的进程情况 - lsof -i[46] [protocol][@hostname|hostaddr][:service|port]:用于显示符合条件的进程情况, 可以指定协议、主机名、端口号等参数。 通过lsof命令,我们可以更好地了解进程与文件之间的关系,帮助我们在需要操作文件系统时避免出现操作失败的情况。比如,在卸载文件系统时,使用lsof命令可以找出哪些进程正在使用当前要卸载的文件系统,从而避免操作失败。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux命令之lsof](https://blog.csdn.net/ljbcharles/article/details/131479338)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux lsof命令详解](https://blog.csdn.net/xiao_yi_xiao/article/details/124143337)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值