[Linux] lsof Command Examples
Contents
lsof(list open files)是一个列出当前系统打开文件的工具。
用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。
因为 lsof 命令需要访问核心内存和各种文件,所以需要 root 用户执行。
被打开的文件可以是如下:
- 普通文件
 - 目录
 - 网络文件系统的文件
 - 字符或设备文件
 - (函数)共享库
 - 管道,命名管道
 - 符号链接
 - 网络文件(例如:NFS file、网络socket,unix域名socket)
 - 还有其它类型的文件,等等
 
命令用法
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                   显示版本信息
输出各列信息
 | 
 | 
COMMAND:进程的名称PID:进程标识符PPID:父进程标识符(需要指定-R参数)USER:进程所有者PGID:进程所属组FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序lnn:library references (AIX);er:FD information error (see NAME column);jld:jail directory (FreeBSD);ltx:shared library text (code and data);mxx:hex memory-mapped type number xx.m86:DOS Merge mapped file;mem:memory-mapped file;mmap:memory-mapped device;pd:parent directory;rtd:root directory;tr:kernel trace file (OpenBSD);v86VP/ix mapped file;0:表示标准输出1:表示标准输入2:表示标准错误
- 一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等
u:表示该文件被打开并处于读取/写入模式r:表示该文件被打开并处于只读模式w:表示该文件被打开并处于空格:表示该文件的状态模式为unknow,且没有锁定-:表示该文件的状态模式为unknow,且被锁定
 - 同时在文件状态模式后面,还跟着相关的锁
N:对于未知类型的 Solaris NFS 锁r:文件部分的读锁R:整个文件的读锁w:文件的部分写锁W:整个文件的写锁u:任何长度的读写锁U:用于未知类型的锁x:用于部分文件上的 SCO OpenServer Xenix 锁X:用于整个文件上的 SCO OpenServer Xenix 锁space:无锁.
 - TYPE:文件类型,如DIR、REG等,常见的文件类型
DIR:表示目录CHR:表示字符类型BLK:块设备类型UNIX: UNIX 域套接字FIFO:先进先出 (FIFO) 队列IPv4:网际协议 (IP) 套接字DEVICE:指定磁盘的名称SIZE:文件的大小NODE:索引节点(文件在磁盘上的标识)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 #利用打开文件进程恢复已删除文件