lsof替代了netstat和ps的全部工作。它可以带来那些工具所能带来的一切,而且要比那些工具多得多
最重要的是,当你给它传递选项时,默认行为是对结果进行“或”运算。因此,如果是用-i来拉出一个端口列表,同时又用-p来拉出一个进程列表,那么默认情况下你会获得两者的结果。
lsof打开的文件可以是:
1.普通文件
2.目录
3.网络文件系统的文件
4.字符或设备文件
5.(函数)共享库
6.管道,命名管道
7.符号链接
8.网络文件(例如:NFS file、网络socket,unix域名socket)
9.还有其它类型的文件,等等
下面的一些其它东西需要牢记:
默认 : 没有选项,lsof列出活跃进程的所有打开文件
组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数
-a 结果进行“与”运算(而不是“或”,默认是“或”运算)
-l 默认显示用户名,使用-l显示UID
-U 列出UNIX域套接字文件
-u USER 列出USER用户打开哪些文件
-p PID 列出进程号为PID的进程打开了哪些文件
-c httpd 列出指定进程所打开的文件
-g PGID 查看进程组ID为PGID打开的文件
+d <目录> 列出目录下被打开的文件
+D <目录> 递归列出目录下被打开的文件
-d <FD类型> cwd、txt、mem等(见下文),对列出的内容根据FD类型进行过滤,^表示取反,数字可使用0-9表示范围
-i <条件> 列出符合条件的进程。(4、6、协议<tcp|udp>、:端口、 @ip ),该选项可以替代netstat指令
-P 配合-i使用,显示端口号,而不显示服务名,必须放在-i选项之前
-n 配合-i使用,显示IP,而不显示主机名,必须放在-i选项之前
如:
lsof -nPi
-s UDP|TCP:LISTEN|... 按照协议以及连接状态过滤
-t 仅列出进程PID
-F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)
-i 显示所有连接的情况
-i 6 仅获取IPv6流量
-i tcp 仅显示TCP连接
-i udp 仅显示UDP连接
-i :PORT 来显示与指定端口相关的网络信息
-i :服务名 如-i :http 等同于-i :PORT
-i @HOST 来显示指定到指定主机的连接
-i @HOST:PORT 显示基于主机与端口的连接
-i -sTCP:LISTEN <==> lsof -i | grep -i LISTEN 找出正等候连接的端口
lsof -i -sTCP:ESTABLISHED <==> lsof -i | grep -i ESTABLISHED 找出已经建立连接的端口
lsof |grep deleted #查找已经被删除但仍未释放的文件(文件仍然被程序占用)
[root@http22 ~]# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 1310 root 4u IPv6 10939 0t0 TCP *:http (LISTEN)
httpd 2992 apache 4u IPv6 10939 0t0 TCP *:http (LISTEN)
httpd 2993 apache 4u IPv6 10939 0t0 TCP *:http (LISTEN)
httpd 2994 apache 4u IPv6 10939 0t0 TCP *:http (LISTEN)
每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。
lsof输出各列信息的意义如下:
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称或服务名
FD列中的文件描述:
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
(1)cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
(2)txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
(3)lnn:library references (AIX);
(4)er:FD 信息错误 (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合并映射文件;
(9)mem:内存映射文件
(10)mmap:内存映射设备
(11)pd:父目录
(12)rtd:根目录
(13)tr:核心跟踪文件 (OpenBSD);
(14)v86 VP/ix 映射文件;
(15)0:表示标准输出
(16)1:表示标准输入
(17)2:表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等
(1)u:表示该文件被打开并处于读取/写入模式
(2)r:表示该文件被打开并处于只读模式
(3)w:表示该文件被打开并处于
(4)空格:表示该文件的状态模式为unknow,且没有锁定
(5)-:表示该文件的状态模式为unknow,且被锁定
同时在文件状态模式后面,还跟着相关的锁
(1)N:for a Solaris NFS lock of unknown type;
(2)r:for read lock on part of the file;
(3)R:for a read lock on the entire file;
(4)w:for a write lock on part of the file;(文件的部分写锁)
(5)W:for a write lock on the entire file;(整个文件的写锁)
(6)u:for a read and write lock of any length;
(7)U:for a lock of unknown type;
(8)x:for an SCO OpenServer Xenix lock on part of the file;
(9)X:for an SCO OpenServer Xenix lock on the entire file;
(10)space:if there is no lock.
TYPE:文件类型,如DIR、REG等,常见的文件类型
(1)DIR:表示目录
(2)CHR:表示字符类型
(3)BLK:块设备类型
(4)UNIX: UNIX 域套接字
(5)FIFO:先进先出 (FIFO) 队列
(6)IPv4:网际协议 (IP) 套接字
恢复删除文件
当系统中的某个文件被意外删除了,只要这个时候系统中有进程正在访问这个文件,那么可以通过lsof 从/proc目录下恢复文件的内容
假如/var/log/messages文件被删了,恢复这个文件的方法:
首先使用lsof 查看当前是否有进程打开/var/log/messages文件,
lsof |grep /var/log/messages
[root@localhost ~]# rm /var/log/messages
rm:是否删除普通文件 "/var/log/messages"?y
[root@localhost ~]# lsof |grep /var/log/messages
rsyslogd 5925 root 1w REG 8,2 4369 266184 /var/log/messages (deleted)
从上面的信息可以看到PID 5925(syslogd)打开文件的文件描述符为1,同时发现/var/log/messages已经被删除了。
因此可以通过/var/log/messages文件描述符来查看文件信息。
cat /pro/5925/fd/1
最后通过重定向的方法恢复被删除的/var/log/messages
cat /pro/5925/fd/1 > /var/log/messages