lsof被称为unix/linux 调试的瑞士军刀,一般root用户才能执行lsof命令,普通用户可以看见/usr/sbin/lsof命令,但是普通用户执行会显示“permission denied” ,其具体用法如下:

1lsof abc.txt 显示开启文件abc.txt的进程
2lsof -i :22 知道22端口现在运行什么程序
3lsof -c abc 显示abc进程现在打开的文件
4lsof -g gid 显示归属gid的进程情况
5lsof +d /usr/local/ 显示目录下被进程开启的文件
6lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
7lsof -d 4 显示使用fd为4的进程
8lsof -i 用以显示符合条件的进程情况

列出所有网络连接:

1# lsof -i

lsof的-i选项可以列出所有打开了网络套接字(TCP和UDP)的进程。

列出所有TCP网络连接

1# lsof -i tcp

也可以为-i选项加上参数,比如tcp,tcp选项会强制lsof只列出打开TCP sockets的进程。

列出所有UDP网络连接

1# lsof -i udp

同样udp让lsof只列出使用UDP socket的进程。语法:

 1# lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
 246 --> IPv4 or IPv6
 3protocol --> TCP or UDP
 4hostname --> Internet host name
 5hostaddr --> IPv4位置
 6service --> /etc/service中的 service name (可以不只一个)
 7port --> 端口号 (可以不只一个)
 8例子: TCP:25 - TCP and port 25
 9@1.2.3.4 - Internet IPv4 host address 1.2.3.4
10tcp@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,列出打开的文件

1# lsof -u ucsp

-u选项限定只列出所有被用户ucsp打开的文件,你可以通过逗号指定多个用户:

1# lsof -u sms,root   (该条也可使用lsof -u sms -u root)

这条命令会列出所有sms和root用户打开的文件。

找到某个用户的所有网络连接,使用-a将-u和-i选项组合可以让lsof列出某个用户的所有网络行为。

1# lsof -a -u hacker -i

列出所有NFS(网络文件系统)文件,这个参数很好记,-N就对应NFS。

1# lsof -N

列出所有UNIX域Socket文件

1# lsof -U

这个选项也很好记,-U就对应UNIX。

列出所有对应某个组id的进程

1# lsof -g 1234

复合查询(OR)被打开文件信息

1#lsof -u nobody -c httpd

复合查询(AND)被打开文件信息

1#lsof -a -u root -c httpd

查看除root之外所有用户的被打开文件

1#lsof -u ^root

查看具体进程PID的被打开文件

1#lsof -p 10101
2#lsof -p 10101,10102,10103

lsof在实际操作中的一个重要应用:查看那些已经删除但仍被某个进程占用的文件。(该状况下会出现空间得不到释放的问题)当你的磁盘空间爆满时,而又发现文件所占空间并未达到磁盘上限时可以使用命令lsof |grep deleted命令查看下那些已被删除但仍未被释放的文件,如下图:

17
17

发现该情况时可通过两个方法解决问题。

一、查看占用该文件的进程,杀掉该进程,文件被释放,空间也就释放了。
二、但遇到僵死进程时, kill或kill -9命令是无法结束该进程的,只有重启服务器,杀死进程,空间也就自己释放了。

所以,平时我们在删除文件时,能使用清空命令而不用删除时,尽量使用清空命令。如:echo ” “>a.out,这样就将a.out文件的内容清空了。