码迷,mamicode.com
首页 > 其他好文 > 详细

系统性能监控工具 - lsof

时间:2014-12-06 12:45:25      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:http   io   ar   使用   sp   on   文件   数据   log   

lsof [options] filename
      列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
     如果说netcat是进行网络诊断的瑞士军刀,那么lsof就是Unix调试的瑞士军刀。Lsof是遵从Unix哲学的典范,它只做一件事情,并且做的相当完美—它可以列出某个进程打开的所有文件信息。打开的文件可能是普通的文件,目录,NFS文件,块文件,字符文件,共享库,常规管道,明明管道,符号链接,Socket流,网络Socket,UNIX域Socket,以及其它更多。因为Unix系统中几乎所有东西都是文件,你可以想象lsof该有多有用。
     在终端下输入lsof即可显示系统打开的文件,因为lsof需要访问核心内存和各种文件,所以必须以root用户的身份运行它才能够充分地发挥其功能。

1)列出所有打开的文件
lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 8,1 4096 2 /
init 1 root rtd DIR 8,1 4096 2 /
init 1 root txt REG 8,1 150584 654127 /sbin/init
udevd 415 root 0u CHR 1,3 0t0 6254 /dev/null
udevd 415 root 1u CHR 1,3 0t0 6254 /dev/null
udevd 415 root 2u CHR 1,3 0t0 6254 /dev/null
udevd 690 root mem REG 8,1 51736 302589 /lib/x86_64-linux-gnu/libnss_files-2.13.so
syslogd 1246 syslog 2w REG 8,1 10187 245418 /var/log/auth.log
syslogd 1246 syslog 3w REG 8,1 10118 245342 /var/log/syslog
dd 1271 root 0r REG 0,3 0 4026532038 /proc/kmsg
dd 1271 root 1w FIFO 0,15 0t0 409 /run/klogd/kmsg
dd 1271 root 2u CHR 1,3 0t0 6254 /dev/null
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:
COMMAND:进程的名称 
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
FD列中的文件描述符cwd值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改,txt类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的/sbin/init程序。其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该文件被打开并处于读取/写入模式,而不是只读 ? 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从0到2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的FD都是从3开始。
与FD列相比,Type列则比较直观。文件和目录分别称为REG和DIR。而CHR和BLK分别表示字符和块设备;或者UNIX、FIFO和IPv4,分别表示UNIX 域套接字、先进先出(FIFO)队列和网际协议(IP)套接字。

2)找出谁(进程)在使用某个文件
lsof /path/to/file
只需要执行文件的路径,lsof就会列出所有使用这个文件的进程,你也可以列出多个文件,lsof会列出所有使用这些文件的进程:lsof /path/to/file1 /path/to/file2
lsof /etc/passwd 哪个进程在占用/etc/passwd
lsof /dev/hda6 哪个进程在占用hda6
lsof /dev/cdrom 哪个进程在占用光驱
lsof `which httpd` 哪个进程在使用apache的可执行文件

3)递归查找某个目录中所有打开的文件
lsof +D /usr/lib
加上+D参数,lsof会对指定目录进行递归查找,注意这个参数要比grep版本慢:lsof|grep ‘/usr/lib‘,之所以慢是因为+D首先查找所有的文件,然后一次性输出。

4)列出某个用户打开的所有文件
lsof -u pkrumins
-u选项限定只列出所有被用户pkrumins打开的文件,你可以通过逗号指定多个用户:lsof -u rms,root,这条命令会列出所有rms和root用户打开的文件。你也可以像下面这样使用多个-u做同样的事情:lsof -u rms -u root

5)查找某个程序打开的所有文件
lsof -c apache
-c选项限定只列出以apache开头的进程打开的文件,所以你可以不用像下面这样写:lsof | grep foo,而使用下面这个更简短的版本:lsof -c foo
lsof -c sendmail 查看sendmail进程的文件使用情况
lsof -c courier -u ^zahn 显示出那些文件被以courier打头的进程打开,但是并不属于用户zahn
也可以只指定进程名称的开头:lsof -c apa 这会列出所有以apa开头的进程打开的文件,同样可以制定多个-c参数:lsof -c apache -c python,这会列出所有由apache和python打开的文件。

6)组合。列出所有由某个用户或某个进程打开的文件
lsof -u pkrumins -c apache
可以组合使用多个选项,这些选项默认进行或关联,也就是说上面的命令会输入由pkrumins用户或是apache进程打开的文件。
列出所有由一个用户与某个进程打开的文件:lsof -a -u pkrumins -c bash -a参数可以将多个选项的组合条件由或变为与,上面的命令会显示所有由pkrumins用户以及bash进程打开的文件。

7)列出除root用户外的所有用户打开的文件
lsof -u ^root
注意root前面的^符号,它执行取反操作,因此lsof会列出所有root用户之外的用户打开的文件。

8)取反。列出所有由某个PID对应的进程打开的文件
lsof -p 1
-p选项让你可以使用进程id来过滤输出。也可以用逗号来分离多个pid:lsof -p 450,980,333
列出所有进程打开的文件除了某个pid的:lsof -p ^1 同前面的用户一样,你也可以对-p选项使用^来进行取反。

9)网络连接
lsof -i 列出所有网络连接,lsof的-i选项可以列出所有打开了网络套接字(TCP和UDP)的进程。
lsof -i tcp 列出所有TCP网络连接
lsof -i udp 列出所有UDP网络连接
lsof -i :25 找到使用某个端口的进程,:25和-i选项组合可以让lsof列出占用TCP或UDP的25端口的进程。也可以使用/etc/services中制定的端口名称来代替端口号,比如:lsof -i :smtp
lsof -i udp:53 找到使用某个udp端口号的进程
lsof -a -u hacker -i 找到某个用户的所有网络连接
lsof -N 列出所有NFS(网络文件系统)文件
lsof -U 列出所有UNIX域Socket文件
lsof -g 1234 列出所有对应某个组id的进程

10)文件描述符 
lsof -d 2 列出所有以描述符2打开的文件
lsof -d 0-2 列出所有描述符为0,1,2的文件。
lsof -d mem 列出所有内存映射文件,-d选项还支持其它很多特殊值

11)输出使用某些资源的进程pid
lsof -t -i -t选项输出进程的PID,你可以将它和-i选项组合输出使用某个端口的进程的PID,下面的命令将会杀掉所有使用网络的进程:kill -9 `lsof -t -i`

12)循环列出文件
lsof -r 1 -r选项让lsof可以循环列出文件直到被中断,参数1的意思是每秒钟重复打印一次,这个选项最好同某个范围比较小的查询组合使用,比如用来监测网络活动:lsof -r 1 -u john -i -a

系统性能监控工具 - lsof

标签:http   io   ar   使用   sp   on   文件   数据   log   

原文地址:http://www.cnblogs.com/yezhaohui/p/4148052.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!