linux中的lsof命令简介(某公司社招笔试试题)

        我们都知道, 在linux中, 任何东西都是以文件形式存在的, 这句话貌似被大家说的太多次了, 下面仅仅举3个例子。

        比如, ls命令其实也是个文件, 它对应一个可执行文件, 当敲入ls的时候, 实际上就是运行了该可执行文件, 拉起一个进程, 这个进程读取当前目录下的东东, 然后显示出来。那这个可执行文件对应的源代码是怎样的呢? 熟悉APUE的朋友肯定有印象, 不熟悉APUE的朋友请翻书。

        再比如, 在linux设备上插入u盘后, u盘便对应一个挂载目录, 此时应用程序可以直接访问, 所以, 说u盘也是一个文件(目录也可以理解为文件), 毫不为过。 你要是在装Windows的机器上插个u盘, 那应用程序怎么访问呢? 我不知道到, 也没有玩过, 这么看来, Windows有时很恼人。

        再再比如, test.txt是个文件, 相信大家肯定没有什么异议了。

 

        千言万语汇成一句话: 在linux中, 文件的含义是广义的, 用一切皆文件来形容也毫不为过。 那么, 怎么查看某个进程打开的文件呢? 用lsof命令吧,  搞linux开发的, 不能不熟悉它。 lsof是list open files的缩写。 我们先看下面这个程序(test.c):

 

#include <stdio.h>

int main()
{
	FILE *fp = fopen("test.txt", "wr");	
	while(1);

	return 0;
}

 

        编译运行, 得到:

 

[taoge@localhost learn_c]$ gcc test.c
[taoge@localhost learn_c]$ ./a.out 

        因为程序中有死循环, 所以程序卡住。 我们再次开启另外一个shell终端, 并在其中执行如下命令, 得到如下结果:

 

[taoge@localhost learn_c]$ lsof | awk '{if(1==NR || "a.out"==$1)  print $0}'
COMMAND    PID      USER   FD      TYPE     DEVICE SIZE/OFF       NODE NAME
a.out     2561     taoge  cwd       DIR        8,2     4096     164029 /home/taoge/Desktop/learn_c
a.out     2561     taoge  rtd       DIR        8,2     4096          2 /
a.out     2561     taoge  txt       REG        8,2     4691     158160 /home/taoge/Desktop/learn_c/a.out
a.out     2561     taoge  mem       REG        8,2   141492     158062 /lib/ld-2.12.so
a.out     2561     taoge  mem       REG        8,2  1855584     158063 /lib/libc-2.12.so
a.out     2561     taoge    0u      CHR      136,0      0t0          3 /dev/pts/0
a.out     2561     taoge    1u      CHR      136,0      0t0          3 /dev/pts/0
a.out     2561     taoge    2u      CHR      136,0      0t0          3 /dev/pts/0
a.out     2561     taoge    3w      REG        8,2        0     158207 /home/taoge/Desktop/learn_c/test.txt
[taoge@localhost learn_c]$ 

        可以看到, 上面就是a.out进程打开的一些文件, 当然, 有的朋友可能对awk不太熟悉, 那行, 我换一个一种方式, 如下:

 

 

[taoge@localhost learn_c]$ lsof -c a.out 
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
a.out   2561 taoge  cwd    DIR    8,2     4096 164029 /home/taoge/Desktop/learn_c
a.out   2561 taoge  rtd    DIR    8,2     4096      2 /
a.out   2561 taoge  txt    REG    8,2     4691 158160 /home/taoge/Desktop/learn_c/a.out
a.out   2561 taoge  mem    REG    8,2   141492 158062 /lib/ld-2.12.so
a.out   2561 taoge  mem    REG    8,2  1855584 158063 /lib/libc-2.12.so
a.out   2561 taoge    0u   CHR  136,0      0t0      3 /dev/pts/0
a.out   2561 taoge    1u   CHR  136,0      0t0      3 /dev/pts/0
a.out   2561 taoge    2u   CHR  136,0      0t0      3 /dev/pts/0
a.out   2561 taoge    3w   REG    8,2        0 158207 /home/taoge/Desktop/learn_c/test.txt
[taoge@localhost learn_c]$ 

       可以看到, 结果是一样的。 从上面可知, a.out进程的进程号是2561, 那怎么根据进程号来查看进程打开了哪些文件呢? 且看:

 

 

[taoge@localhost learn_c]$ lsof -p 2561
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
a.out   2561 taoge  cwd    DIR    8,2     4096 164029 /home/taoge/Desktop/learn_c
a.out   2561 taoge  rtd    DIR    8,2     4096      2 /
a.out   2561 taoge  txt    REG    8,2     4691 158160 /home/taoge/Desktop/learn_c/a.out
a.out   2561 taoge  mem    REG    8,2   141492 158062 b/ld-2.12.so
a.out   2561 taoge  mem    REG    8,2  1855584 158063 bbc-2.12.so
a.out   2561 taoge    0u   CHR  136,0      0t0      3 /dev/pts/0
a.out   2561 taoge    1u   CHR  136,0      0t0      3 /dev/pts/0
a.out   2561 taoge    2u   CHR  136,0      0t0      3 /dev/pts/0
a.out   2561 taoge    3w   REG    8,2        0 158207 /home/taoge/Desktop/learn_c/test.txt
[taoge@localhost learn_c]$ 

        

 

       说道这里, 我们自然要问, 如何查找某一文件被哪个进程打开呢? 且看:

 

[taoge@localhost learn_c]$ lsof test.txt
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
a.out   2561 taoge    3w   REG    8,2        0 158207 test.txt
[taoge@localhost learn_c]$ 

       可见, test.txt被a.out进程打开。

 

        对了, 差点忘了说, 我们常用netstat -nao来查看某端口, 当然, 我们也可以用lsof -i:xxx  来查询, 其中xxx是port, 还可以查出对应的进程哈。

 

       lsof的更多参数, 我就不一一说了, 网上一搜一大堆, 本文仅仅简要介绍一下lsof.  

 

       一见lsof深似海, 从此不再是路人! OK, 先这样, 外面的雨, 很大。
 

 

 

 

 

 

### Linux 中 `lsof` 命令的使用指南 #### 什么是 `lsof`? `lsof`(list open files)是一个强大的工具,用于列出当前系统中打开的文件。在 Linux/Unix 系统中,几乎所有资源都被视为文件处理,包括网络连接、管道、套接字和设备等[^2]。 #### 基本语法 ```bash lsof [选项] [文件] ``` --- #### 常用功能与示例 ##### 1. 列出所有打开的文件 运行以下命令可查看当前系统中所有的打开文件: ```bash lsof ``` 此操作可能会返回大量信息,建议配合 `grep` 或重定向到文件以便分析[^5]。 ##### 2. 查看特定用户的打开文件 要查找指定用户(如 `username`)打开了哪些文件,可以使用 `-u` 参数: ```bash lsof -u username ``` 例如,查询用户 `tecmint` 打开的文件: ```bash lsof -u tecmint ``` 这有助于排查某用户的活动情况[^4]。 ##### 3. 查找特定进程的打开文件 如果知道目标进程 ID (`PID`),可以通过 `-p` 参数获取该进程的相关信息: ```bash lsof -p PID ``` 例如,对于 PID 为 1 的 systemd 进程: ```bash lsof -p 1 ``` 输出可能类似于以下内容: ```plaintext systemd 1 root mem REG 8,18 262408 5247436 /lib/x86_64-linux-gnu/libblkid.so.1.1.0 ``` 这里展示了 `/lib/x86_64-linux-gnu/libblkid.so.1.1.0` 文件由 PID=1 的进程加载并保持打开状态[^3]。 ##### 4. 查询特定路径下的打开文件 利用 `+D` 参数可以列举某个目录及其子目录内的所有打开文件: ```bash lsof +D /path/to/directory ``` 比如检查 `/etc` 下是否有未关闭的配置文件: ```bash lsof +D /etc ``` ##### 5. 搜索网络连接相关的文件 为了监控系统的网络活动,可以用 `-i` 参数来筛选涉及 TCP/IP 协议的条目: ```bash lsof -i ``` 或者进一步限定至某一端口号上的通信状况: ```bash lsof -i :port_number ``` 假设需要定位占用 HTTP 默认服务端口 (80) 的程序,则输入如下指令即可实现快速诊断: ```bash lsof -i :80 ``` ##### 6. 显示监听中的套接字 若想单独提取处于 LISTEN 状态的服务端点详情,那么加上额外条件参数 `-sTCP:LISTEN` 将非常有用: ```bash lsof -i -sTCP:LISTEN ``` ##### 7. 排查无法卸载磁盘的原因 有时尝试挂载分区失败是因为某些应用程序仍然持有其中的数据对象句柄而阻止释放动作完成;此时借助于 `lsof` 可迅速找到罪魁祸首: ```bash lsof /mount_point_path/ ``` --- #### 权限注意事项 需要注意的是,通常只有超级管理员(root账户)才有权限执行完整的 `lsof` 功能集合。普通用户虽然可以看到安装位置(/usr/sbin/lsof),但在实际调用过程中往往会遇到 “Permission Denied” 错误提示。 --- ### 总结 综上所述,`lsof` 不仅能帮助运维人员掌握实时资源分配概况,而且还能有效辅助解决诸如调试异常行为等问题场景下的难题。熟练运用其丰富的过滤机制无疑会让工作效率倍增! ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值