Linux内核调试之lsof命令和fuser命令

lsof命令简介:

lsof(list open files)是一个列出当前系统打开文件的工具。在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以,lsof的功能很强大。一般root用户才能执行lsof命令,普通用户可以看见/usr/sbin/lsof命令,但是普通用户执行会显示“permission denied”。因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下: 
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称


关于使用lsof指令配合Linux内核调试的用法如下:

1.sudo su [切换到root]

2.打开一个终端,输入:hexdump /dev/input/event2 【这里event2 是鼠标事件

3.打开另一个终端,输入:lsof /dev/input/event2

lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
Xorg    1226 root   20u   CHR  13,66      0t0  208 /dev/input/event2
hexdump 4526 root    0r   CHR  13,66      0t0  208 /dev/input/event2

这里,可以看到打开文件/dev/input/event2对应的进程有Xorg  hexdump 以及对应的PID号。这样,就可以很方便地找到一个被打开的设备文件对应的应用程序。如下:


另外

lsof cc.txt 显示开启文件cc.txt的进程

lsof 目录名 查找谁在使用文件目录系统


lsof -i :22 知道22端口被哪个进程占用

lsof -c a.out 显示a.out进程现在打开的文件

lsof -g gid 显示归属gid的进程情况

lsof -n 不将IP转换为hostname,缺省是不加上-n参数

lsof -p 12 看进程号为12的进程打开了哪些文件

lsof -u username 查看用户打开哪些文件

lsof -i @192.168.1.111 查看远程已打开的网络连接(连接到192.168.1.111)
--------------------------------------

lsof -i 用以显示符合条件的进程情况

语法: lsof -i[46] [protocol][@hostname|hostaddr][:service|port]

46 -> IPv4 or IPv6

protocol -> TCP or UDP

hostname -> Internet host name

hostaddr -> IPv4位置

service -> /etc/service中的 service name (可以不只一个)

port -> 端口号 (可以不只一个)

--------------------------------------
lsof +|-r [t] 控制lsof不断重复执行,缺省是15s刷新

-r,lsof会永远不断的执行,直到收到中断信号

+r,lsof会一直执行,直到没有档案被显示

例子:不断查看目前ftp连接的情况:lsof -i [email protected]:ftp -r



fuser命令简介:

fuser 是Linux上的一个命令,用以由文件或设备去找出使用文件、或设备的进程。该命令列出本地进程的进程号,那些本地进程使用File 参数指定的本地或远程文件。对于阻塞特别设备,此命令列出了使用该设备上任何文件的进程。

用途
使用文件或文件结构识别进程。[1] 

语法
fuser [ -c | -d | -f ] [ -k ] [ -u ] [ -x ] [ -V ]文件 …

选项
-c 包含 File的文件系统中关于任何打开的文件的报告。
-d 暗示使用了 -c 和 -x 标志。关于任何与文件系统(自父目录删除的)无链接的打开文件的报告。当与 -V 标志一起使用时,它也会报告被删除文件的节点号和大小。
-f 仅对文件的打开实例报告。
-k 将 SIGKILL 信号发送到每个本地进程。仅有 root 用户能终止另一用户的进程。
-u 为进程号后圆括号中的本地进程提供登录名。
-V 提供详细输出。
-x 与 -c 或 -f 连用,报告除标准 fuser 输出以外的可执行的和可载入的对象。

示例

要列出使用 /etc/passwd 文件的本地进程的进程号,请输入:
fuser /etc/passwd
要列出使用 /etc/filesystems 文件的进程的进程号和用户登录名,请输入:
fuser -u /etc/filesystems
要终止使用给定文件系统的所有进程,请输入:
fuser -k -x -u -c /dev/hd1 或者 fuser -kxuc /home


参考:

http://blog.csdn.net/xifeijian/article/details/9088137

http://blog.csdn.net/dc3120/article/details/39056393



猜你喜欢

转载自blog.csdn.net/ZHONGkunjia/article/details/71775120