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进程打开。
linux中的lsof命令简介相关推荐
- linux dmesg信息哪来的,linux中的dmesg命令简介
今天, 我们来介绍一个linux中的dmesg命令,事实上, 我们之前用过, 但是没有单独介绍过. 看一下dmesg命令的用途吧: dmesg命令用会把开机信息存到ring bufer中, 形成一个缓 ...
- linux中的ldd命令简介
在linux中, 有些命令是大家通用的, 比如ls, rm, mv, cp等等, 这些我觉得没有必要再细说了. 而有些命令, 只有开发人员才会用到的, 这类命令, 作为程序员的我们, 是有必要了解的, ...
- linux中的strip命令简介------给文件脱衣服
作为一名linux开发人员, 如果没有听说过strip命令, 那是很不应该的. strip这个单词, 大家应该早就学过了, 你就记住是脱衣服就行了, 别的不要多想. 在linux中, ...
- linux中的nm命令简介【转】
(转自:https://blog.csdn.net/stpeace/article/details/47089585) nm不是ni ma的缩写, 当然, 也不是ni mei的缩写, 而是names的 ...
- linux中的nm命令
代码在git 是names的缩写, nm命令主要是用来列出某些文件中的符号(说白了就是一些函数和全局变量等). 下面, 我们一起来看看. linux中的nm命令简介 nm * nm: main.c: ...
- Linux操作系统上lsof命令详解
Linux操作系统上lsof命令详解 2011-10-08 18:31:31 http://xjsunjie.blog.51cto.com/999372/682865 标签:Linux lsof命令 ...
- linux中sed命令用例,Linux中使用sed命令或awk命令修改常规配置文件
一.方案: Linux中使用sed命令或awk命令修改常规配置文件 二.步骤: 1.假设有一个a.txt,内容如下: #!/bin/bash aa= bbb= ccc= #ddd= 2.如果想要把里面 ...
- Python学习之旅:使用Python实现Linux中的ls命令
一.写在前面 前几天在微信上看到这样一篇文章,链接为:https://mp.weixin.qq.com/s/rl6Sgv3uk_IpoFAx6cWa8w,在这篇文章中,有这样一段话,吸引了我的注意: ...
- python中的ls是什么意思_Python学习之旅:使用Python实现Linux中的ls命令
一.写在前面 在 Linux 中 ls 是一个使用频率非常高的命令了,可选的参数也有很多, 算是一条不得不掌握的命令.Python 作为一门简单易学的语言,被很多人认为是不需要认真学的,或者只是随便调 ...
最新文章
- jpa批量删除数据_EXCEL批量删除非数值数据,这么多方法你用哪一个?
- Python可视化matplotlib多子图可视化(Multiple Subplots):plt.axes()、plt.subplot()、plt.subplots()、
- ThinkPHP的安装
- How should I set up tag files for a multi-level directory hierarchy? kiss snow
- MUI调用原生自定义方法实现计算缓存与清空缓存
- mysql动态sql是什么,mysql中动态sql的一次实际应用
- zookeeper基本原理
- 深度学习11-tf.data详解以及猫狗图片分类实战
- C++关键字 explicit
- flex布局——回顾
- 七月算法机器学习 9 推荐系统与应用
- 卡密社区源码无加密完整版(php源码+mysql脚本)
- 工控安全PLC固件逆向二
- 点云配准(CloudCompare软件)
- 旅行计划 c++_设计旅行计划器
- 详谈外部H5页面跳转微信一键关注微信公众号的方案
- ANSYS apdl命令流笔记6--------生成线的10种方法
- Comet OJ - 2019国庆欢乐赛(赛后整理)
- 基于MVC设计(Java Web程序)----图书馆系统
- 【1999年分区联赛提高组之一】【图论】【最小点覆盖】【匈牙利】拦截导弹