【www.bbyears.com--linux】
Lsof是遵从Unix哲学的典范,它只做一件事情,并且做的相当完美。以列出某个进程打开的所有文件信息。打开的文件可能是普通的文件,目录,NFS文件,块文件,字符文件,共享库,常规管道,符号链接,Socket流,网络Socket,UNIX域Socket,以及其它。
在UNIX环境中,文件无处不在,这便产生了一句格言:“任何事物都是文件”。通过文件不仅仅可以访问常规数据,通常还可以访问网络连接和硬件。在有些情况下,当您使用ls 请求目录清单时,将出现相应的条目。在其他情况下,如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字,不存在相应的目录清单。但是在后台为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。
因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,所以能够查看这个列表将是很有帮助的。完成这项任务的实用程序称为lsof,它对应于“list open files”(列出打开的文件)。几乎在每个 UNIX 版本中都有这个实用程序,但奇怪的是,大多数供应商并没有将其包含在操作系统的初始安装中。要获取更多关于lsof 的信息,请参见参考资料部分。
常用参数解释:
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 -L, 作用: 列出打开文件的连接数
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中的 servicename (可以不只一个)
port –> 端口号 (可以不只一个)
lsof被称为unix/linux 调试的瑞士军刀,一般root用户才能执行lsof命令,普通用户可以看见/usr/sbin/lsof命令,但是普通用户执
行会显示“permission denied” ,其具体用法如下:
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
lsof的-i选项可以列出所有打开了网络套接字(TCP和UDP)的进程。
列出所有TCP网络连接
# lsof -i tcp
也可以为-i选项加上参数,比如tcp,tcp选项会强制lsof只列出打开TCP
sockets的进程。
列出所有UDP网络连接
# lsof -i udp
同样udp让lsof只列出使用UDP socket的进程。
语法: 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,列出打开的文件 # lsof -u ucsp
-u选项限定只列出所有被用户ucsp打开的文件,你可以通过逗号指定多个用户:
# lsof -u sms,root (该条也可使用lsof -u sms -u root)
这条命令会列出所有sms和root用户打开的文件。
找到某个用户的所有网络连接
# lsof -a -u hacker -i
使用-a将-u和-i选项组合可以让lsof列出某个用户的所有网络行为。
列出所有NFS(网络文件系统)文件
# lsof -N
这个参数很好记,-N就对应NFS。
列出所有UNIX域Socket文件
# lsof -U
这个选项也很好记,-U就对应UNIX。
列出所有对应某个组id的进程
# lsof -g 1234
lsof在实际操作中的一个重要应用:
查看那些已经删除但仍被某个进程占用的文件。(该状况下会出现空间得不到释放的问题)
当你的磁盘空间爆满时,而又发现文件所占空间并未达到磁盘上限时可以使用命令
lsof |grep deleted命令查看下那些已被删除但仍未被释放的文件,如下图:lsof
发现该情况时可通过两个方法解决问题。
一、查看占用该文件的进程,杀掉该进程,文件被释放,空间也就释放了。
二、但遇到僵死进程时, kill或kill -9命令是无法结束该进程的,只有重启服务器,杀死进程,空间也就自己释放了。
所以,平时我们在删除文件时,能使用清空命令而不用删除时,尽量使用清空命令。如:echo " ">a.out,这样就将a.out文件的内容清空了。