在UNIX系统下, 可以把任何一个对象看成是对象。如一个正在运行的进程(/proc/run/sys … etc)。访问文件不仅仅指的是常规的文件(regular, binary), 也有许多其他类型的文件,如block,charcater,FIFO,unix socket, socket等。当你通过ls命令,来查看指定目录下的目录清单的时候,可以查看一部分文件类型的目录清单,但有些情况不存在对应得目录清单, 如TCP和UDP socket就是这样的例子。但后台为该应用程序提供一个文件描述符,这个文件描述符为应用程序和操作系统提供操作的接口。
lsof的基本用法
直接在命令行执行lsof, 你会得到类似如下的信息:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 104,1 4096 2 /
init 1 root rtd DIR 104,1 4096 2 /
init 1 root txt REG 104,1 37384 2318357 /sbin/init
init 1 root mem REG 104,1 14696 3573005 /lib/libdl-2.11.2.so
init 1 root mem REG 104,1 1432968 3573006 /lib/libc-2.11.2.so
init 1 root mem REG 104,1 109464 3571777 /lib/libselinux.so.1
init 1 root mem REG 104,1 237168 3571778 /lib/libsepol.so.1
init 1 root mem REG 104,1 128744 3573018 /lib/ld-2.11.2.so
init 1 root 10u FIFO 0,13 2708 /dev/initctl
kthreadd 2 root cwd DIR 104,1 4096 2 /
kthreadd 2 root rtd DIR 104,1 4096 2 /
kthreadd 2 root txt unknown /proc/2/exe
输出的字段含义:
COMMAND-- 命令名称 PID-- 进程ID USER-- 进程的拥有者
FD和TYPE字段包含关于该文件如何使用的更多信息, FD表示文件描述符,应用程序通过文件描述符来访问文件。Type列提供了关于文件的更多描述。
FD字段的值“CWD”表示当前应用程序的工作目录, “TXT”表示程序的txt或data段。 而在上面的例子中“10u” 表示init程序以FIFO方式打开/dev/initctl, 其文件描述符为10, 并且“u”表示该文件处于读入/写出模式,其他的还有“r”和“u”分别表示以只读和只写模式打开。
与FD字段相比, TYPE字段更简单些, 可能的值为DIR(目录)REG(文件),CHR(字符设备),BLK(块设备),UNIX(Unix domain socket),FIFO(命名管道), IPv4(internet 套接字)。
lsof的实际使用场景:
lsof –a –p 605 –d ^txt
-a 表示与的关系,也就是-p 605 和 –d ^txt二者都要成立。
lsof查看网络连接:
网络连接也是文件,因此也可以通过lsof来获取他们的信息。如果你只知道相应的端口,如80, 则可以用lsof –i :80 来进行套接字收索。
lsof –i :80 查看监听80端口的进程
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
apache2 5177 root 4u IPv6 6484160 TCP *:www (LISTEN)
apache2 6373 www-data 4u IPv6 6484160 TCP *:www (LISTEN)
apache2 6374 www-data 4u IPv6 6484160 TCP *:www (LISTEN)
原文出自如下连接:
http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html