|
lsof 的全称是 list opend files,其意是列举系统中已经被打开的文件。通过此命令,可以根据文件找到对应的进程信息,反过来也可以根据进程信息找到进程打开的文件。
lsof 功能强大,选项也很多,但常见的 4 个选项参数为 -c, -p, -i 。
如果想知道特定文件被哪个进程使用,可以直接 lsof filename,如:$ lsof /usr/lib/firefox-3.6.10/firefox-bin
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firefox-b 2282 beyes txt REG 8,2 50636 10488017 /usr/lib/firefox-3.6.10/firefox-bin 上面表示 firefox 浏览器被用户 beyes 打开。
-c 参数,可以查看进程打开的文件,如下面的一段程序:#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int fd, fd1, fd2;
fd = open ("main.c", O_RDONLY);
fd1 = open ("pipe.c", O_RDONLY);
sleep (60);
close (fd);
close (fd1);
return (0);
} 仅打开本地两个文本文件,main.c 和 pipe.c 。编译后,用 lsof 命令查看:$ lsof lsof.exe
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
lsof.exe 2995 beyes txt REG 8,5 8384 11406523 lsof.exe
beyes@beyes-desktop:~/books/ldd3-samples/scull$ lsof -c lsof.exe
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
lsof.exe 2995 beyes cwd DIR 8,5 4096 11403436 /home/beyes/books/ldd3-samples/scull
lsof.exe 2995 beyes rtd DIR 8,2 4096 2 /
lsof.exe 2995 beyes txt REG 8,5 8384 11406523 /home/beyes/books/ldd3-samples/scull/lsof.exe
lsof.exe 2995 beyes mem REG 8,2 1405508 5505227 /lib/tls/i686/cmov/libc-2.11.1.so
lsof.exe 2995 beyes mem REG 8,2 113964 5505427 /lib/ld-2.11.1.so
lsof.exe 2995 beyes 0u CHR 136,2 0t0 5 /dev/pts/2
lsof.exe 2995 beyes 1u CHR 136,2 0t0 5 /dev/pts/2
lsof.exe 2995 beyes 2u CHR 136,2 0t0 5 /dev/pts/2
lsof.exe 2995 beyes 3r REG 8,5 16424 11403438 /home/beyes/books/ldd3-samples/scull/main.c
lsof.exe 2995 beyes 4r REG 8,5 11138 11403440/home/beyes/books/ldd3-samples/scull/pipe.c 上面显示了 lsof.exe 打开文件的信息。FD 表示文件描述符;TYPE 表示文件类型;SIZE 表示文件的大小;NODE 表示本地文件的 node 码(节点号);NAME 表示文件的全路经或挂载点(如NFS文件系统)。从蓝色部分看到,程序在打开了一系列自身运行需要的文件,进到 main() 中后,打开了 main.c 和 pipe.c 两个文件。
-p 参数,通过进程号显示程序打开的所有文件及相关命令。例如上面的 lsof.exe,可以先通过 ps 命令获得 PID 号,然后:
-i 参数,通过监听指定的协议、端口和主机等信息,显示符合条件的进程信息。使用语法:lsof -i [46] [protocol] [@hostname] [:service | port] 46 : 4 表示 IPv4,6 表示 IPv6.
protocol : 传输协议,可以是 TCP 或 UDP
hostname : 主机名或 IP 地址
service : 进程的服务名,如 ssh ftp nfs 等。
port : 系统服务的端口号,如 http 的 80 端口,ssh 的 22 端口等。
下面显示 80 端口的信息:
这里 80 端口是本地架设的 http 服务器,一开始时没有任何连接,当执行了 lsof -i :80: 后,会如下显示:$ lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 阻塞在这里,以等待链接信息的到来。现在打开 firefox 连接本地 http 服务器:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firefox-b 2282 beyes 27u IPv4 32426 0t0 TCP beyes-desktop.local:48096->58.51.95.10:www (ESTABLISHED) 从上面看到,firefox 这个程序和 http 服务器建立了连接,而 firefox 是通过 48096 这个端口发出的连接。
|
|