一、简介
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
二、输出信息含义
在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 3,3 1024 2 /
init 1 root rtd DIR 3,3 1024 2 /
init 1 root txt REG 3,3 38432 1763452 /sbin/init
init 1 root mem REG 3,3 106114 1091620 /lib/libdl-2.6.so
init 1 root mem REG 3,3 7560696 1091614 /lib/libc-2.6.so
init 1 root mem REG 3,3 79460 1091669 /lib/libselinux.so.1
init 1 root mem REG 3,3 223280 1091668 /lib/libsepol.so.1
init 1 root mem REG 3,3 564136 1091607 /lib/ld-2.6.so
init 1 root 10u FIFO 0,15 1309 /dev/initctl
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) 套接字。
三、常用参数
lsof语法格式是:
lsof [options] filename
lsof abc.txt 显示开启文件abc.txt的进程 lsof -c abc 显示abc进程现在打开的文件 lsof -c -p 1234 列出进程号为1234的进程所打开的文件 lsof -g gid 显示归属gid的进程情况 lsof +d /usr/local/ 显示目录下被进程开启的文件 lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长 lsof -d 4 显示使用fd为4的进程 lsof -i 用以显示符合条件的进程情况 lsof -i[46] [protocol][@hostname|hostaddr][:service|port] --> IPv4 or IPv6 protocol --> TCP or UDP hostname --> Internet host name hostaddr --> IPv4地址 service --> /etc/service中的 service name (可以不止一个) port --> 端口号 (可以不止一个)</span></span>
lsof +|-r [t] 控制lsof不断重复执行,缺省是15s刷新
-r,lsof会永远不断的执行,直到收到中断信号
+r,lsof会一直执行,直到没有档案被显示
四、使用实例
1、查找所有打开的文件
[root@redhat5 ~]# lsof | head COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root cwd DIR 8,3 4096 2 / init 1 root rtd DIR 8,3 4096 2 / init 1 root txt REG 8,3 38652 4484999 /sbin/ini t init 1 root mem REG 8,3 125736 492620 /lib/ld-2 .5.so init 1 root mem REG 8,3 1611564 492621 /lib/libc -2.5.so init 1 root mem REG 8,3 16428 492622 /lib/libd l-2.5.so init 1 root mem REG 8,3 93508 492636 /lib/libs elinux.so.1 init 1 root mem REG 8,3 245376 492635 /lib/libs epol.so.1 init 1 root 10u FIFO 0,17 1506 /dev/init ctl
FD - File descriptor
FD 列包含这样一些值
cwd - Current working directory txt - Text file mem - Memory Mapped file mmap - Memory Mapped device Number - It represent the actual file descriptor. For example, 0u, 1w and 3r r 是读的意思,w 是写,u 代表读写
Type 代表文件类型,例如:
>REG - Regular file >DIR - Directory >CHR - Character special file >FIFO - First in first out2、查找用户打开的文件
[root@redhat5 ~]# lsof -u boco COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME bash 3599 boco cwd DIR 8,3 4096 752939 /home/boco/script bash 3599 boco rtd DIR 8,3 4096 2 / bash 3599 boco txt REG 8,3 735004 3306367 /bin/bash bash 3599 boco mem REG 8,3 125736 492620 /lib/ld-2.5.so bash 3599 boco mem REG 8,3 1611564 492621 /lib/libc-2.5.so bash 3599 boco mem REG 8,3 16428 492622 /lib/libdl-2.5.so bash 3599 boco mem REG 8,3 13276 492642 /lib/libtermcap.so.2.0.8 bash 3599 boco mem REG 8,3 46680 491080 /lib/libnss_files-2.5.so bash 3599 boco mem REG 8,3 25462 2588743 /usr/lib/gconv/gconv-modu les.cache bash 3599 boco mem REG 8,3 56452288 2492259 /usr/lib/locale/locale-ar chive bash 3599 boco 0u CHR 136,0 2 /dev/pts/0 bash 3599 boco 1u CHR 136,0 2 /dev/pts/0 bash 3599 boco 2u CHR 136,0 2 /dev/pts/0 bash 3599 boco 255u CHR 136,0 2 /dev/pts/0 java 3707 boco cwd DIR 8,3 4096 752939 /home/boco/script java 3707 boco rtd DIR 8,3 4096 2 / java 3707 boco txt REG 8,3 47308 3404707 /usr/local/jdk1.6.0_45/bi n/java java 3707 boco mem REG 8,3 125736 492620 /lib/ld-2.5.so java 3707 boco mem REG 8,3 1611564 492621 /lib/libc-2.5.so java 3707 boco mem REG 8,3 208352 492627 /lib/libm-2.5.so java 3707 boco mem REG 8,3 16428 492622 /lib/libdl-2.5.so java 3707 boco mem REG 8,3 129716 492623 /lib/libpthread-2.5.so java 3707 boco mem REG 8,3 44060 492624 /lib/librt-2.5.so java 3707 boco mem REG 8,3 101404 492632 /lib/libnsl-2.5.so java 3707 boco mem REG 8,3 15032320 3178121 /usr/local/jdk1.6.0_45/jr e/lib/i386/client/classes.jsa java 3707 boco mem REG 8,3 52557932 2983708 /usr/local/jdk1.6.0_45/jr e/lib/rt.jar java 3707 boco mem REG 8,3 77119 3114849 /usr/local/jdk1.6.0_45/jr e/lib/i386/libzip.so java 3707 boco mem REG 8,3 46680 491080 /lib/libnss_files-2.5.so java 3707 boco mem REG 8,3 32768 327367 /tmp/hsperfdata_boco/3707 java 3707 boco mem REG 8,3 189222 3114847 /usr/local/jdk1.6.0_45/jr e/lib/i386/libjava.so java 3707 boco mem REG 8,3 6450682 3178118 /usr/local/jdk1.6.0_45/jr e/lib/i386/client/libjvm.so java 3707 boco mem REG 8,3 38142 3277888 /usr/local/jdk1.6.0_45/jr e/lib/i386/jli/libjli.so java 3707 boco mem REG 8,3 56701 3114846 /usr/local/jdk1.6.0_45/jr e/lib/i386/libverify.so java 3707 boco 0u CHR 136,0 2 /dev/pts/0 java 3707 boco 1u CHR 136,0 2 /dev/pts/0 java 3707 boco 2u CHR 136,0 2 /dev/pts/0 java 3707 boco 3r REG 8,3 52557932 2983708 /usr/local/jdk1.6.0_45/jr e/lib/rt.jar java 3707 boco 5w FIFO 0,6 15657 pipe java 3707 boco 6r FIFO 0,6 15658 pipe java 3707 boco 8r FIFO 0,6 15659 pipe sleep.sh 3717 boco cwd DIR 8,3 4096 752939 /home/boco/script sleep.sh 3717 boco rtd DIR 8,3 4096 2 / sleep.sh 3717 boco txt REG 8,3 735004 3306367 /bin/bash sleep.sh 3717 boco mem REG 8,3 125736 492620 /lib/ld-2.5.so sleep.sh 3717 boco mem REG 8,3 1611564 492621 /lib/libc-2.5.so sleep.sh 3717 boco mem REG 8,3 16428 492622 /lib/libdl-2.5.so sleep.sh 3717 boco mem REG 8,3 13276 492642 /lib/libtermcap.so.2.0.8 sleep.sh 3717 boco 0r FIFO 0,6 15657 pipe sleep.sh 3717 boco 1w FIFO 0,6 15658 pipe sleep.sh 3717 boco 2w FIFO 0,6 15659 pipe sleep.sh 3717 boco 255r REG 8,3 47 752964 /home/boco/script/sleep.s h sleep 3718 boco cwd DIR 8,3 4096 752939 /home/boco/script sleep 3718 boco rtd DIR 8,3 4096 2 / sleep 3718 boco txt REG 8,3 19564 3306437 /bin/sleep sleep 3718 boco mem REG 8,3 125736 492620 /lib/ld-2.5.so sleep 3718 boco mem REG 8,3 1611564 492621 /lib/libc-2.5.so sleep 3718 boco 0r FIFO 0,6 15657 pipe sleep 3718 boco 1w FIFO 0,6 15658 pipe sleep 3718 boco 2w FIFO 0,6 15659 pipe3、 列出在某个端口运行的进程
[root@redhat5 ~]# lsof -i:23 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME xinetd 3309 root 5u IPv4 12942 TCP *:telnet (LISTEN) telnetd 3597 root 0u IPv4 14212 TCP localhost:telnet->localhost:49887 (ESTABLISHED) telnetd 3597 root 1u IPv4 14212 TCP localhost:telnet->localhost:49887 (ESTABLISHED) telnetd 3597 root 2u IPv4 14212 TCP localhost:telnet->localhost:49887 (ESTABLISHED) [root@redhat5 ~]# lsof -i:22 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sshd 3257 root 3u IPv6 12673 TCP *:ssh (LISTEN)
4、 列出端口在 22-23 之间的所有进程
[root@redhat5 ~]# lsof -i:22-23 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sshd 3257 root 3u IPv6 12673 TCP *:ssh (LISTEN) xinetd 3309 root 5u IPv4 12942 TCP *:telnet (LISTEN) telnetd 3597 root 0u IPv4 14212 TCP localhost:telnet->localhost:49887 (ESTABLISHED) telnetd 3597 root 1u IPv4 14212 TCP localhost:telnet->localhost:49887 (ESTABLISHED) telnetd 3597 root 2u IPv4 14212 TCP localhost:telnet->localhost:49887 (ESTABLISHED)
5、只列出使用 IPv4 的打开文件
[root@redhat5 ~]# lsof -i 4 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME dhclient 2747 root 4u IPv4 9709 UDP *:bootpc portmap 2876 rpc 3u IPv4 10060 UDP *:sunrpc portmap 2876 rpc 4u IPv4 10061 TCP *:sunrpc (LISTEN) rpc.statd 2916 root 3u IPv4 10196 UDP *:975 rpc.statd 2916 root 6u IPv4 10183 UDP *:972 rpc.statd 2916 root 7u IPv4 10209 TCP *:978 (LISTEN) hpiod 3220 root 0u IPv4 12562 TCP redhat5.4-baby:2208 (LISTEN) python 3225 root 4u IPv4 12582 TCP redhat5.4-baby:2207 (LISTEN) cupsd 3272 root 4u IPv4 12754 TCP redhat5.4-baby:ipp (LISTEN) cupsd 3272 root 6u IPv4 12757 UDP *:ipp xinetd 3309 root 5u IPv4 12942 TCP *:telnet (LISTEN) sendmail 3333 root 4u IPv4 12940 TCP redhat5.4-baby:smtp (LISTEN) avahi-dae 3467 avahi 13u IPv4 13585 UDP *:mdns avahi-dae 3467 avahi 15u IPv4 13587 UDP *:36306 telnetd 3597 root 0u IPv4 14212 TCP localhost:telnet->localhost:49 887 (ESTABLISHED) telnetd 3597 root 1u IPv4 14212 TCP localhost:telnet->localhost:49 887 (ESTABLISHED) telnetd 3597 root 2u IPv4 14212 TCP localhost:telnet->localhost:49 887 (ESTABLISHED)
6、只列出使用 IPv6 的打开文件
[root@redhat5 ~]# lsof -i 6 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sshd 3257 root 3u IPv6 12673 TCP *:ssh (LISTEN) avahi-dae 3467 avahi 14u IPv6 13586 UDP *:mdns avahi-dae 3467 avahi 16u IPv6 13588 UDP *:384027、根据进程pid列出打开的文件
[root@redhat5 ~]# lsof -p 3707 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME java 3707 boco cwd DIR 8,3 4096 752939 /home/boco/script java 3707 boco rtd DIR 8,3 4096 2 / java 3707 boco txt REG 8,3 47308 3404707 /usr/local/jdk1.6.0_45/bin /java java 3707 boco mem REG 8,3 125736 492620 /lib/ld-2.5.so java 3707 boco mem REG 8,3 1611564 492621 /lib/libc-2.5.so java 3707 boco mem REG 8,3 208352 492627 /lib/libm-2.5.so java 3707 boco mem REG 8,3 16428 492622 /lib/libdl-2.5.so java 3707 boco mem REG 8,3 129716 492623 /lib/libpthread-2.5.so java 3707 boco mem REG 8,3 44060 492624 /lib/librt-2.5.so java 3707 boco mem REG 8,3 101404 492632 /lib/libnsl-2.5.so java 3707 boco mem REG 8,3 15032320 3178121 /usr/local/jdk1.6.0_45/jre /lib/i386/client/classes.jsa java 3707 boco mem REG 8,3 52557932 2983708 /usr/local/jdk1.6.0_45/jre /lib/rt.jar java 3707 boco mem REG 8,3 77119 3114849 /usr/local/jdk1.6.0_45/jre /lib/i386/libzip.so java 3707 boco mem REG 8,3 46680 491080 /lib/libnss_files-2.5.so java 3707 boco mem REG 8,3 32768 327367 /tmp/hsperfdata_boco/3707 java 3707 boco mem REG 8,3 189222 3114847 /usr/local/jdk1.6.0_45/jre /lib/i386/libjava.so java 3707 boco mem REG 8,3 6450682 3178118 /usr/local/jdk1.6.0_45/jre /lib/i386/client/libjvm.so java 3707 boco mem REG 8,3 38142 3277888 /usr/local/jdk1.6.0_45/jre /lib/i386/jli/libjli.so java 3707 boco mem REG 8,3 56701 3114846 /usr/local/jdk1.6.0_45/jre /lib/i386/libverify.so java 3707 boco 0u CHR 136,0 2 /dev/pts/0 java 3707 boco 1u CHR 136,0 2 /dev/pts/0 java 3707 boco 2u CHR 136,0 2 /dev/pts/0 java 3707 boco 3r REG 8,3 52557932 2983708 /usr/local/jdk1.6.0_45/jre /lib/rt.jar java 3707 boco 5w FIFO 0,6 15657 pipe java 3707 boco 6r FIFO 0,6 15658 pipe java 3707 boco 8r FIFO 0,6 15659 pipe8、根据进程名称列出打开的文件
[root@redhat5 ~]# lsof -c java COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME java 3707 boco cwd DIR 8,3 4096 752939 /home/boco/script java 3707 boco rtd DIR 8,3 4096 2 / java 3707 boco txt REG 8,3 47308 3404707 /usr/local/jdk1.6.0_45/bin /java java 3707 boco mem REG 8,3 125736 492620 /lib/ld-2.5.so java 3707 boco mem REG 8,3 1611564 492621 /lib/libc-2.5.so java 3707 boco mem REG 8,3 208352 492627 /lib/libm-2.5.so java 3707 boco mem REG 8,3 16428 492622 /lib/libdl-2.5.so java 3707 boco mem REG 8,3 129716 492623 /lib/libpthread-2.5.so java 3707 boco mem REG 8,3 44060 492624 /lib/librt-2.5.so java 3707 boco mem REG 8,3 101404 492632 /lib/libnsl-2.5.so java 3707 boco mem REG 8,3 15032320 3178121 /usr/local/jdk1.6.0_45/jre /lib/i386/client/classes.jsa java 3707 boco mem REG 8,3 52557932 2983708 /usr/local/jdk1.6.0_45/jre /lib/rt.jar java 3707 boco mem REG 8,3 77119 3114849 /usr/local/jdk1.6.0_45/jre /lib/i386/libzip.so java 3707 boco mem REG 8,3 46680 491080 /lib/libnss_files-2.5.so java 3707 boco mem REG 8,3 32768 327367 /tmp/hsperfdata_boco/3707 java 3707 boco mem REG 8,3 189222 3114847 /usr/local/jdk1.6.0_45/jre /lib/i386/libjava.so java 3707 boco mem REG 8,3 6450682 3178118 /usr/local/jdk1.6.0_45/jre /lib/i386/client/libjvm.so java 3707 boco mem REG 8,3 38142 3277888 /usr/local/jdk1.6.0_45/jre /lib/i386/jli/libjli.so java 3707 boco mem REG 8,3 56701 3114846 /usr/local/jdk1.6.0_45/jre /lib/i386/libverify.so java 3707 boco 0u CHR 136,0 2 /dev/pts/0 java 3707 boco 1u CHR 136,0 2 /dev/pts/0 java 3707 boco 2u CHR 136,0 2 /dev/pts/0 java 3707 boco 3r REG 8,3 52557932 2983708 /usr/local/jdk1.6.0_45/jre /lib/rt.jar java 3707 boco 5w FIFO 0,6 15657 pipe java 3707 boco 6r FIFO 0,6 15658 pipe java 3707 boco 8r FIFO 0,6 15659 pipe [root@redhat5 ~]# [root@redhat5 ~]# lsof | grep TestSleep [root@redhat5 ~]# jps 3707 TestSleep 3798 Jps9、只显示pid
[root@redhat5 ~]# lsof -t -u boco 3599 3707 3717 3718
10、列出所有侦听和已建立的网络连接
[root@redhat5 ~]# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME dhclient 2747 root 4u IPv4 9709 UDP *:bootpc portmap 2876 rpc 3u IPv4 10060 UDP *:sunrpc portmap 2876 rpc 4u IPv4 10061 TCP *:sunrpc (LISTEN) rpc.statd 2916 root 3u IPv4 10196 UDP *:975 rpc.statd 2916 root 6u IPv4 10183 UDP *:972 rpc.statd 2916 root 7u IPv4 10209 TCP *:978 (LISTEN) hpiod 3220 root 0u IPv4 12562 TCP redhat5.4-baby:2208 (LISTEN) python 3225 root 4u IPv4 12582 TCP redhat5.4-baby:2207 (LISTEN) sshd 3257 root 3u IPv6 12673 TCP *:ssh (LISTEN) cupsd 3272 root 4u IPv4 12754 TCP redhat5.4-baby:ipp (LISTEN) cupsd 3272 root 6u IPv4 12757 UDP *:ipp xinetd 3309 root 5u IPv4 12942 TCP *:telnet (LISTEN) sendmail 3333 root 4u IPv4 12940 TCP redhat5.4-baby:smtp (LISTEN) avahi-dae 3467 avahi 13u IPv4 13585 UDP *:mdns avahi-dae 3467 avahi 14u IPv6 13586 UDP *:mdns avahi-dae 3467 avahi 15u IPv4 13587 UDP *:36306 avahi-dae 3467 avahi 16u IPv6 13588 UDP *:38402 telnetd 3597 root 0u IPv4 14212 TCP localhost:telnet->localhost:49 887 (ESTABLISHED) telnetd 3597 root 1u IPv4 14212 TCP localhost:telnet->localhost:49 887 (ESTABLISHED) telnetd 3597 root 2u IPv4 14212 TCP localhost:telnet->localhost:49 887 (ESTABLISHED)
其它例子:
列出所有打开的文件
# lsof
不带任何参数执行lsof,就会列出所有进程打开的所有文件。
查找谁在使用某个文件
# lsof /path/to/file
以文件的路径为参数,lsof将会列出所有用这个文件的进程。
您也可以指定多个文件,lsof会列出所有使用这些文件的进程。
# lsof /path/to/file1 /path/to/file2
递归查找某个目录下所有打开的文件
# lsof +D /usr/lib
带上”+D”参数,lsof会在指定目录及其下所有子目录中查找找开的文件。注意这个操作效率比通常版本的grep低。
# lsof | grep '/usr/lib'
之所以慢,是因为”+D”首先查找所有文件,然后再执行输出。
列出某个用户打开的所有文件
# lsof -u pkrumins
“-u”选项(认为是user)限定输出内容,只显示”pkrumins”用户打开的文件。您也可以同时限定多个用户,用户名之间以逗号为分隔符(译者注:逗号左右不要出现空格):
# lsof -u rms,root
这条命令会列出rms用户和root用户打开的所有文件。
另一种方式是多次使用”-u”选项,也能达到相同的目的:
# lsof -u rms -u root
按进程名查找打开的文件
# lsof -c apache
“-c”选项限定只列出进程名以”apache”打头的进程所打开的文件。因此,可以不用写:
# lsof | grep foo
而写成更简短的版本:
# lsof -c foo
事实上,您可以仅指定进程名的开头部分进行查找:
# lsof -c apa
上面这条命令将列出所有名字以apa打头的进程所打开的文件。
您还可以同时指定多个”-c”选项,以关联多个进程:
# lsof -c apache -c python
这条命令将会列出apache和python打开的所有文件。
译者注,对于多线程的进程来说,显示TID(Task ID)有时是必要的,但是用“-c”选项缺省是不列出子任务的,这时可以加上"-K"(大写)选项。
列出某个用户或进程打开的所有文件
# lsof -u pkrumins -c apache
Lsof的选项可以关联组合。缺省的关联条件是或(OR)。这意味着上面这条命令输出的内容为:列出用户pkrumins 或进程apache打开的所有文件。
列出某个用户与某个进程打开的所有文件
# lsof -a -u pkrumins -c bash
注意”-a”选项。它把关联组合的逻辑,由或(OR)变成与(AND)。所以上面这条命令输出内容为:pkrumins用户所属的,bash进程打开的所有文件。
列出除了root用户之外,其它用户打开的所有文件
# lsof -u ^root
注意root用户名之前的”^”字符。它执行取反操作。所以这条命令输出所有非root用户打开的文件。
列出某个PID进程打开的所有文件
# lsof -p 1
“-p”(联想PID)选项,限定以进程的ID为过滤条件。记住,您可以在一个“-p”选项中,用逗号分隔的方式指定多个PID,也可以多次指定“-p”选项:
# lsof -p 450,980,333
这条命令列出PID为450、980和333的进程打开的所有文件。
列出某个PID之外,其它进程打开的所有文件
# lsof -p ^1
又碰到取反操作符”^”了。上面这条命令列出PID 1之外的进程打开的所有文件。
列出所有网络连接
# lsof -i
通过”-i”选项,lsof列出所有打开网络套接字(TCP和UDP)的进程。
列出所有TCP网络连接
# lsof -i tcp
”-i”选项有几个参数,”tcp”就是其中之一,它限定lsof仅显示打开TCP套接字的进程。
列出所有UDP网络连接
# lsof -i udp
”-i”选项的参数值改为”udp”,就可以显示打开UDP套接字的进程了。
查找谁占用了某个端口
# lsof -i :25
”-i”选项的参数值改为”:25”,lsof就会查找占用25端口的进程(包括TCP和UDP)。您也可能指定端口服务名(详见/etc/services)),而不指定具体端口号:
# lsof -i :smtp
查找谁占用了某个UDP端口
# lsof -i udp:53
同样,查找占用的TCP端口命令为:
# lsof -i tcp:80
查找某个用户占用的网络端口
# lsof -a -u hacker -i
这里,”-a”选项关联组合了”-u”和”-i”选项。上面使命列出了用户hacker所占用的网络端口。
列出所有NFS(网络文件系统)文件
# lsof -N
”-N”选项很容易记住,因为它就是NFS。
列出所有Unix socket文件
# lsof -U
”-U”选项很容易记住,因为它就是UNIX。
列出指定组ID的进程所打开的所有文件
# lsof -g 1234
进程组用于结进程进行逻辑分组。上面例子查找PGID为1234的进程组成员打开的所有文件。
列出与某个特定文件描述符关联的所有文件
# lsof -d 2
上面这条命令,列出所有打开文件描述符2的进程。您还可以指定文件描述符的范围:
# lsof -d 0-2
这样会列出与文件描述符0、1、2关联的所有进程。
“-d”还选项还有许多特定参数可选,比方说”mem”,它列出内存映射文件:
# lsof -d mem
还有”txt”表示加载进内存,正在执行的进程:
# lsof -d txt
输出占用某些资源的进程PID
# lsof -t -i
“-t”选项,限定lsof仅输出进程的PID。它与”-i”选项组合,就只显示所有打开网络连接的进程PID。这样,如果要杀死所有使用网络的进程就很容易了:
# kill -9 `lsof -t -i`
循环执行lsof
# lsof -r 1
“-r”选项,告诉lsof不断地重复执行。参数值1表示重复周期为1秒。这
# lsof -r 1 -u john -i -a
4lsof特殊实例
一、查找谁在使用文件系统
在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下:
# lsof /GTES11/
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 4208 root cwd DIR 3,1 4096 2 /GTES11/
vim 4230 root cwd DIR 3,1 4096 2 /GTES11/
在这个示例中,用户root正在其/GTES11目录中进行一些操作。一个 bash是实例正在运行,并且它当前的目录为/GTES11,另一个则显示的是vim正在编辑/GTES11下的文件。要成功地卸载/GTES11,应该在通知用户以确保情况正常之后,中止这些进程。 这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。
二、恢复删除的文件
当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。
当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。
当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。 假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:
首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:
# lsof |grep /var/log/messages
syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)
从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:
# head -n 10 /proc/1283/fd/2
Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007
Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map:
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)
从上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如:
cat /proc/1283/fd/2 > /var/log/messages
对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。
参考文章:
http://blog.csdn.net/chaofanwei/article/details/21373749?utm_source=tuicool
http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316599.html
http://blog.csdn.net/guoguo1980/article/details/2324454
http://blog.csdn.net/yetyongjin/article/details/7740373