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进程打开。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫叶思念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值