Linux 常用命令之lsof

一、简介
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 out

2、查找用户打开的文件

[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 pipe

 3、 列出在某个端口运行的进程

[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 *:38402

 7、根据进程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 pipe

 8、根据进程名称列出打开的文件

[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 Jps

 9、只显示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

这条命令将会列出apachepython打开的所有文件。

译者注,对于多线程的进程来说,显示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

这条命令列出PID450980333的进程打开的所有文件。

 

列出某个PID之外,其它进程打开的所有文件

# lsof -p ^1

又碰到取反操作符^了。上面这条命令列出PID 1之外的进程打开的所有文件。

 

列出所有网络连接

# lsof -i

通过-i选项lsof列出所有打开网络套接字(TCPUDP)的进程。

 

列出所有TCP网络连接

# lsof -i tcp

-i选项有几个参数,tcp就是其中之一,它限定lsof仅显示打开TCP套接字的进程。

 

列出所有UDP网络连接

# lsof -i udp

-i选项的参数值改为udp,就可以显示打开UDP套接字的进程了。

 

查找谁占用了某个端口

# lsof -i :25

-i选项的参数值改为:25lsof就会查找占用25端口的进程(包括TCPUDP)。您也可能指定端口服务名(详见/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

进程组用于结进程进行逻辑分组。上面例子查找PGID1234的进程组成员打开的所有文件。

 

列出与某个特定文件描述符关联的所有文件

# lsof -d 2

上面这条命令,列出所有打开文件描述符2的进程。您还可以指定文件描述符的范围:

# lsof -d 0-2

这样会列出与文件描述符012关联的所有进程。

-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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值