linux中的lsof命令简介(某公司社招笔试试题)
2015-07-22 21:25
489 查看
我们都知道, 在linux中, 任何东西都是以文件形式存在的, 这句话貌似被大家说的太多次了, 下面仅仅举3个例子。
比如, ls命令其实也是个文件, 它对应一个可执行文件, 当敲入ls的时候, 实际上就是运行了该可执行文件, 拉起一个进程, 这个进程读取当前目录下的东东, 然后显示出来。那这个可执行文件对应的源代码是怎样的呢? 熟悉APUE的朋友肯定有印象, 不熟悉APUE的朋友请翻书。
再比如, 在linux设备上插入u盘后, u盘便对应一个挂载目录, 此时应用程序可以直接访问, 所以, 说u盘也是一个文件(目录也可以理解为文件), 毫不为过。 你要是在装Windows的机器上插个u盘, 那应用程序怎么访问呢? 我不知道到, 也没有玩过, 这么看来, Windows有时很恼人。
再再比如, test.txt是个文件, 相信大家肯定没有什么异议了。
千言万语汇成一句话: 在linux中, 文件的含义是广义的, 用一切皆文件来形容也毫不为过。 那么, 怎么查看某个进程打开的文件呢? 用lsof命令吧, 搞linux开发的, 不能不熟悉它。 lsof是list open files的缩写。 我们先看下面这个程序(test.c):
编译运行, 得到:
说道这里, 我们自然要问, 如何查找某一文件被哪个进程打开呢? 且看:
可见, test.txt被a.out进程打开。
对了, 差点忘了说, 我们常用netstat -nao来查看某端口, 当然, 我们也可以用lsof -i:xxx 来查询, 其中xxx是port, 还可以查出对应的进程哈。
lsof的更多参数, 我就不一一说了, 网上一搜一大堆, 本文仅仅简要介绍一下lsof.
一见lsof深似海, 从此不再是路人! OK, 先这样, 外面的雨, 很大。
比如, 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, 先这样, 外面的雨, 很大。
相关文章推荐
- RHEL一(管理文件、通配符、特殊符号)
- Linux目录结构及文件基本操作
- linux patch 命令小结
- linux 日志服务器的构建
- linux文件压缩与解压
- linux中软件包管理
- linux中软件包管理
- 下载adt-bundle-linux-x86_64-20140702.zip 和 android sdk
- linux下vi命令大全
- Linux设备模型(总线、设备、驱动程序和类)
- 如何更改linux文件的拥有者及用户组(chown和chgrp)
- LINUX一切皆文件
- Centos6.5下搭建vsftp服务器和sftp服务器
- Redhat6.5 配置使用centos的yum源
- linux与Windows FTP交互
- Linux1.0系统调用列表
- linux中/etc/fstab文件删除或修改了,导致系统无法启动
- linux下Anaconda python 配置libsvm接口
- Linux系统时间写入CMOS时钟
- linux scp 命令