[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);v86
VP/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 #利用打开文件进程恢复已删除文件