04.20.2011---***---lsof 命令

[1]

http://www.google.com.hk/search?hl=en&source=hp&q=lsof+%E5%91%BD%E4%BB%A4&aq=f&oq=&aqi=

[2]

http://www.linuxfly.org/post/182/

[原]lsof命令常见参数说明
大 | 中 | 小
linuxing , 15:47 , 基础知识 » 系统命令 , 评论(1) , 引用(0) , 阅读(5559) , Via 本站原创 大 | 中 | 小


lsof全名list opened files,也就是列举系统中已经被打开的文件。

我们都知道,

linux环境中,任何事物都是文件,

设备是文件,

目录是文件,

甚至sockets也是文件。

所以,用好lsof命令,对日常的linux管理非常有帮助。

以下的说明,大部分内容来自lsof的manual文档。我所做的只是在中文翻译的基础上,进行简单的分类说明,并列举最常用的参数。

一、输出说明
lsof是linux最常用的命令之一,通常的输出格式为:
引用
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

常见包括如下几个字段:更多的可见manual。
1、COMMAND
默认以9个字符长度显示的命令名称。可使用+c参数指定显示的宽度,若+c后跟的参数为零,则显示命令的全名
2、PID:进程的ID号
3、PPID
父进程的IP号,默认不显示,当使用-R参数可打开。
4、PGID
进程组的ID编号,默认也不会显示,当使用-g参数时可打开。
5、USER
命令的执行UID或系统中登陆的用户名称。默认显示为用户名,当使用-l参数时,可显示UID。
6、FD
是文件的File Descriptor number,或者如下的内容:
(这里很难翻译对应的意思,保留英文)
引用
cwd current working directory;
Lnn library references (AIX);
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);
txt program text (code and data);
v86 VP/ix mapped file;

文件的File Descriptor number显示模式有:
引用
r for read access;
w for write access;
u for read and write access;
N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO OpenServer Xenix lock on part of the file;
X for an SCO OpenServer Xenix lock on the entire file;
space if there is no lock.

7、TYPE
引用
IPv4 IPv4的包;
IPv6 使用IPv6格式的包,即使地址是IPv4的,也会显示为IPv6,而映射到IPv6的地址;
DIR 目录
LINK 链接文件

详情请看manual中更多的注释。
8、DEVICE
使用character special、block special表示的设备号
9、SIZE
文件的大小,如果不能用大小表示的,会留空。使用-s参数控制。
10、NODE
本地文件的node码,或者协议,如TCP等
11、NAME
挂载点和文件的全路径(链接会被解析为实际路径),或者连接双方的地址和端口、状态等

二、参数
1、不带额外参数运行
lsof path/filename

显示已打开该目录或文件的所有进程信息
lsof `which httpd`

显示指定命令的信息
2、参见参数
-c w 显示以w开头命令的已打开文件的信息
lsof -c sshd

-p PID 显示指定PID已打开文件的信息
lsof -p 4401

+d dir 依照文件夹dir来搜寻,但不会打开子目录
lsof +d /root

+D dir 打开dir文件夹以及其子目录搜寻
lsof +D /root/

-d s 以FD列的信息进行匹配,可使用3-10,表示范围,3,10表示某些值
lsof -d 3-10

-u 显示某用户的已经打开的文件(或该用户执行程序已经打开的文件)
lsof -u root
lsof -u 0

◎可配合正规表达式使用
表示不包括root用户的信息:
lsof -u ^root

-i 监听指定的协议、端口、主机等的网络信息,格式为:
引用
[46][proto][@host|addr][:svc_list|port_list]

例如:
lsof -i tcp@192.168.228.244
lsof -i:22

还可以使用一些参数控制显示结果:
引用
-l 禁止将userID转换为登陆名称,即显示UID
-n 禁止将IP地址转换为hostname主机文件
-P 不显示端口名称

-g s 从PGID列进行匹配
lsof -g 3-10


3、其他参数
+f 所有路径参数都必须是文件系统,否则不能执行
-f 所有路径参数都将作为普通的文件,例如:"-f -- /"中的/,只会匹配单个/路径,而不会是根目录中的所有文件
+f和-f后都应加上“--”表终结符:
lsof -f -- /

+L/-L 打开或关闭文件的连结数计算,当+L没有指定时,所有的连结数都会显示(默认);若+L后指定数字,则只要连结数小于该数字的信息会显示;连结数会显示在NLINK列。
例如:+L1将显示没有unlinked的文件信息;+aL1,则显示指定文件系统所有unlinked的文件信息
-L 默认参数,其后不能跟数字,将不显示连结数信息
lsof +L1

-t 仅打印进程,方便shell脚本调用
lsof -t -c sshd

-F 指定输出那个列,可通过lsof -F?查看
-r 不断执行lsof命令,默认每15秒间隔执行一次
+r 也是不断执行lsof命令,但直到没有接受到文件信息,则停止

※部分参数未能完全理解,待以后补充。
附带:lsof manual文档
下载文件
点击这里下载文件
相关日志
[原]一则OOM死机故障的处理过程
Tags: lsof

[3]

http://linux.chinaunix.net/techdoc/system/2007/12/20/974736.shtml

lsof:一个功能强大的命令
lsof命令的原始功能是列出打开的文件的进程,但LINUX下,所有的设备都是以文件的行式存在的,所以,lsof的功能很强大!

语法:lsof [-?ahlnNPRsv][-c c][+|-d d][+|-D D][-g [s]] [+|-L [I]][-p s][+|-r [t]][-u s][names]
参数说明:若没有加上任何参数,lsof会列出所有被程序开启的文件。
-? -h 这两个参数意思相同,显示出lsof的使用说明 -a 参数被视为AND,会影响全部的参数
-C c 显示出以字符或字符串c开头的命令程序开启的文件,如$lsof -C init
+d s 在文件夹s下搜寻,此参数不会继续深入搜寻此文件夹。如显示在/usr/local下被程序开启的文件:$lsof +d /usr/local +D D 同上,但是会以该文件为基础往下全部搜寻,这样花费较大的CPU时 间,请谨慎使用
-d s 此参数以file descriptor(FD)值显示结果,可以采用范围(1-3)或个别,如显示FD为4的进程:$lsof -d 4
-g [s] 以程序的PGID显示,也可以采用范围或个别表示,若没有特别指定,则显示全部,如显示PGID为6的进程:$lsof -g 6
-i 用以监听有关的任何符合的地址,若没有相关地址被指定,则监听全部 
语法: lsof -i [46][protocol][@hostname|hostaddr][:serivce|port]
说明: 46  IPv4 or IPv6
protocol TCP or UDP
hostname internet host name
hostaddr IPv4地址
service /etc/service中的service name
port 端口号
-l 此参数禁止将user ID 转换为登录的名称,默认是登录名称
+|-L [l] +或-表示开启或关闭显示文件连接数,如果只有单纯的+L,后面没有任何数字,则表示显示全部,如果后面有数字,只有文件连接数少于该数字的会被列出
-n 不将IP地址转换为hostname,预设是转换的
-N 显示NFS的文件
-p s 以PID作为显示的依据
-P 此参数禁止将port number转换为service name,预设为转换
+|-r [t] 控制lsof不断重复执行,t为15秒,也就是说每隔15秒再重复执行 +r 一直执行,直到没有文件被显示 -r 永远不断的执行,直到收到中断讯号(ctrl+ c)
-R 此参数增列出PID的子程序,也就是PPID
-s 列出文件的大小,若该文件没有大小,则留下空白
-u s 列出login name或UID为的程序
-v 显示lsof的版本信息

lsof命令的妙用:

当 UNIX 计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以恢复这些文件,并且 lsof 可以为您提供帮助。
  当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录条目。
  # lsof | grep error_log
  httpd 2452 root 2w REG 33,2 499 3090660
  /var/log/httpd/error_log (deleted)
  httpd 2452 root 7w REG 33,2 499 3090660
  /var/log/httpd/error_log (deleted)
  ... more httpd processes ...
  在这个示例中,您可以看到 PID 2452 打开文件的文件描述符为 2(标准错误)和 7。因此,可以在 /proc/2452/fd/7 中查看相应的信息,如清单 1 所示。
  清单 1. 通过 /proc 查找删除的文件
  # cat /proc/2452/fd/7
  [Sun Apr 30 04:02:48 2006] [notice] Digest: generating secret for digest authentication
  [Sun Apr 30 04:02:48 2006] [notice] Digest: done
  [Sun Apr 30 04:02:48 2006] [notice] LDAP: Built with OpenLDAP LDAP SDK
  Linux 的优点在于,它保存了文件的名称,甚至可以告诉我们它已经被删除。在遭到破坏的系统中查找相关内容时,这是非常有用的内容,因为攻击者通常会删除日志以隐藏他们的踪迹。Solaris 并不提供这些信息。然而,我们知道 httpd 守护进程使用了 error_log 文件,所以可以使用 ps 命令找到这个 PID,然后可以查看这个守护进程打开的所有文件。

[4]

http://dev.firnow.com/course/6_system/linux/Linuxjs/20090317/162296.html

一般root用户才能执行lsof命令,普通用户可以看见/usr/sbin/lsof命令,但是普通用户执行会显示“permission denied”

我总结一下lsof指令的用法:

lsof abc.txt 显示开启文件abc.txt的进程

lsof -i :22 知道22端口现在运行什么程序

lsof -c abc 显示abc进程现在打开的文件

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]

46 --> IPv4 or IPv6

protocol --> TCP or UDP

hostname --> Internet host name

hostaddr --> IPv4位置

service --> /etc/service中的 service name (可以不只一个)

port --> 端口号 (可以不只一个)

例子: TCP:25 - TCP and port 25

@1.2.3.4 - Internet IPv4 host address 1.2.3.4

tcp@ohaha.ks.edu.tw:ftp - TCP protocol hosthaha.ks.edu.tw service name:ftp

lsof -n 不将IP转换为hostname,缺省是不加上-n参数

例子: lsof -i tcp@ohaha.ks.edu.tw:ftp -n

lsof -p 12 看进程号为12的进程打开了哪些文件

lsof +|-r [t] 控制lsof不断重复执行,缺省是15s刷新

-r,lsof会永远不断的执行,直到收到中断信号

+r,lsof会一直执行,直到没有档案被显示

例子:不断查看目前ftp连接的情况:lsof -i tcp@ohaha.ks.edu.tw:ftp -r

lsof -s 列出打开文件的大小,如果没有大小,则留下空白

lsof -u username 以UID,列出打开的文件


一般root用户才能执行lsof命令,普通用户可以看见/usr/sbin/lsof命令,但是普通用户执行会显示“permission denied”

我总结一下lsof指令的用法:

lsof abc.txt 显示开启文件abc.txt的进程

lsof -i :22 知道22端口现在运行什么程序

lsof -c abc 显示abc进程现在打开的文件

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]

46 --> IPv4 or IPv6

protocol --> TCP or UDP

hostname --> Internet host name

hostaddr --> IPv4位置

service --> /etc/service中的 service name (可以不只一个)

port --> 端口号 (可以不只一个)

例子: TCP:25 - TCP and port 25

@1.2.3.4 - Internet IPv4 host address 1.2.3.4

tcp@ohaha.ks.edu.tw:ftp - TCP protocol hosthaha.ks.edu.tw service name:ftp

lsof -n 不将IP转换为hostname,缺省是不加上-n参数

例子: lsof -i tcp@ohaha.ks.edu.tw:ftp -n

lsof -p 12 看进程号为12的进程打开了哪些文件

lsof +|-r [t] 控制lsof不断重复执行,缺省是15s刷新

-r,lsof会永远不断的执行,直到收到中断信号

+r,lsof会一直执行,直到没有档案被显示


例子:不断查看目前ftp连接的情况:lsof -i tcp@ohaha.ks.edu.tw:ftp -r

lsof -s 列出打开文件的大小,如果没有大小,则留下空白

lsof -u username 以UID,列出打开的文件

[root@tcx160 FILES]# lsof -i tcp:22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 3261 root 3u IPv6 7301 TCP *:ssh (LISTEN)
sshd 19692 root 3u IPv6 348642 TCP 9.186.96.160:ssh->9.186.96.117:32914 (ESTABLISHED)

[5]

[6]

posted @ 2011-04-20 11:30  陳聽溪  阅读(175)  评论(0编辑  收藏  举报