lsof(list open files)是一个列出当前系统打开文件的工具。

用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。

因为 lsof 命令需要访问核心内存和各种文件,所以需要 root 用户执行。

被打开的文件可以是如下:

  1. 普通文件
  2. 目录
  3. 网络文件系统的文件
  4. 字符或设备文件
  5. (函数)共享库
  6. 管道,命名管道
  7. 符号链接
  8. 网络文件(例如:NFS file、网络socket,unix域名socket)
  9. 还有其它类型的文件,等等

命令用法

lsof [参数] [文件]

lsof [-?abhlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-f[gG]] [+|-e s]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [-Z [Z]] [--] [names]

参数说明

-a                   列出打开文件存在的进程
-c<进程名>           列出指定进程所打开的文件
-g                   列出 GID 号进程详情
-d<文件号>           列出占用该文件号的进程
+d<目录>             列出目录下被打开的文件
+D<目录>             递归列出目录下被打开的文件
-n<目录>             列出使用 NFS 的文件
-i<条件>             列出符合条件的进程(4、6、协议、:端口、@ip)
-p<进程号>           列出指定进程号所打开的文件
-u                   列出 UID 号进程详情
-h                   显示帮助信息
-v                   显示版本信息

输出各列信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[root@localhost ~]# lsof

COMMAND     PID USER   FD      TYPE             DEVICE     SIZE       NODE NAME
init          1 root  cwd       DIR                8,2     4096          2 /
init          1 root  rtd       DIR                8,2     4096          2 /
init          1 root  txt       REG                8,2    43496    6121706 /sbin/init
init          1 root  mem       REG                8,2   143600    7823908 /lib64/ld-2.5.so
init          1 root  mem       REG                8,2  1722304    7823915 /lib64/libc-2.5.so
init          1 root  mem       REG                8,2    23360    7823919 /lib64/libdl-2.5.so
init          1 root  mem       REG                8,2    95464    7824116 /lib64/libselinux.so.1
init          1 root  mem       REG                8,2   247496    7823947 /lib64/libsepol.so.1
init          1 root   10u     FIFO               0,17                1233 /dev/initctl
  • COMMAND:进程的名称
  • PID:进程标识符
  • PPID:父进程标识符(需要指定-R参数)
  • USER:进程所有者
  • PGID:进程所属组
  • FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
    1. cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
    2. txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
    3. lnn:library references (AIX);
    4. er:FD information error (see NAME column);
    5. jld:jail directory (FreeBSD);
    6. ltx:shared library text (code and data);
    7. mxx :hex memory-mapped type number xx.
    8. m86:DOS Merge mapped file;
    9. mem:memory-mapped file;
    10. mmap:memory-mapped device;
    11. pd:parent directory;
    12. rtd:root directory;
    13. tr:kernel trace file (OpenBSD);
    14. v86 VP/ix mapped file;
    15. 0:表示标准输出
    16. 1:表示标准输入
    17. 2:表示标准错误
  • 一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等
    1. u:表示该文件被打开并处于读取/写入模式
    2. r:表示该文件被打开并处于只读模式
    3. w:表示该文件被打开并处于
    4. 空格:表示该文件的状态模式为unknow,且没有锁定
    5. -:表示该文件的状态模式为unknow,且被锁定
  • 同时在文件状态模式后面,还跟着相关的锁
    1. N:对于未知类型的 Solaris NFS 锁
    2. r:文件部分的读锁
    3. R:整个文件的读锁
    4. w:文件的部分写锁
    5. W:整个文件的写锁
    6. u:任何长度的读写锁
    7. U:用于未知类型的锁
    8. x:用于部分文件上的 SCO OpenServer Xenix 锁
    9. X:用于整个文件上的 SCO OpenServer Xenix 锁
    10. space:无锁.
  • TYPE:文件类型,如DIR、REG等,常见的文件类型
    1. DIR:表示目录
    2. CHR:表示字符类型
    3. BLK:块设备类型
    4. UNIX: UNIX 域套接字
    5. FIFO:先进先出 (FIFO) 队列
    6. IPv4:网际协议 (IP) 套接字
    7. DEVICE:指定磁盘的名称
    8. SIZE:文件的大小
    9. NODE:索引节点(文件在磁盘上的标识)
    10. NAME:打开文件的确切名称
  • DEVICE:指定磁盘的名称
  • SIZE:文件的大小
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称

使用示例

几种常见用法:

lsof -i  显示所有网络连接
lsof  filename 显示打开指定文件的所有进程
lsof -a 表示两个参数都必须满足时才显示结果
lsof -c string   显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username  显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数

lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
            46 --> IPv4 or IPv6
            protocol --> TCP or UDP
            hostname --> Internet host name
            hostaddr --> IPv4地址
            service --> /etc/service中的 service name (可以不只一个)
            port --> 端口号 (可以不只一个)

显示指定端口占用进程

lsof -i:22

统计操作系统所有打开的文件

lsof |wc -l

列出所有TCP网络连接

lsof -i tcp

查看udp,53端口

lsof -i udp:53

列举出IPV4

lsof -i 4

列出所有网络文件系统(Network File System, NFS)

lsof -N

找出谁在使用某个文件

lsof /usr/sbin/httpd

递归查找某个目录中所有打开的文件

lsof +D /usr/local

找出占用磁盘的进程

lsof /home

查找某个程序打开的所有文件

lsof -c httpd
lsof -c mysql -c apache #多个进程
lsof  -u mysql -c mysql #指定用户的指定进程

列出某个用户打开的所有文件

lsof -u <username>|more #单个用户
lsof -u <username>,root|more #多个用户

列出除root用户外的所有用户打开的文件

lsof -u ^root

列出所有由某个PID对应的进程打开的文件

lsof -p 3377 #单个pid
lsof -p 3377,3388 #多个pid

列出除了某个进程号以外的所有进程打开的文件信息

lsof -p ^3377 #单个pid
lsof -p ^3377,^3388 #多个pid

根据文件描述范围列出文件信息

lsof -d 1
lsof -d 2-3
#0表示标准输入,1表示标准输出,2表示标准错误,大多数应用程序所打开的文件的 FD 都是从 3 开始

列出COMMAND列中包含字符串"sshd”,且文件描符的类型为txt的文件信息

lsof -c sshd -a -d txt
COMMAND   PID USER  FD   TYPE DEVICE   SIZE    NODE NAME
sshd     2756 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24155 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24905 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd
sshd    24937 root txt    REG    8,2 409488 1027867 /usr/sbin/sshd

列出被进程号为1234的进程所打开的所有IPV4 network files

lsof -i 4 -a -p 1234

列出目前连接主机peida.linux上端口为:20,21,22,25,53,80相关的所有文件信息,且每隔3秒不断的执行lsof指令

lsof -i @peida.linux:20,21,22,25,53,80 -r 3

列出TCP已经建立链接的端口

lsof -i -s TCP:ESTABLISHED

列出所有监听状态的端口

lsof -i -s TCP:LISTEN

统计指定PID打开的文件数

lsof -i |grep 3377 |grep -wc ESTABLISHED

统计指定端口打开的文件数

lsof -i :8080 |grep -wc ESTABLISHED
netstat -lan |grep 8080 |grep -wc ESTABLISHED

杀掉属于某个用户的所有进程

kill -9 `lsof -t -u lakshmanan`

拿出打开某个文件的所有进程

lsof -t /var/log/syslog

检查出已经删除文件未释放仍然占用文件的进程

lsof -n | grep delete
kill -9 `lsof -n | grep delete`

巧用losf恢复已删除文件

echo "lsof test" >lsof.log #创建文件
tail -f lsof.log & #创建打开文件进程后台运行
lsof -t lsof.log #查看打开文件进程

rm -rf lsof.log #删除文件
losf | grep lsof.log #利用打开文件进程恢复已删除文件

参考