lsof, LiSt Opened Files, 列出打开的文件, 听起来很简单的样子. 但想*nix中很多其他工具一样, lsof把这件简单的事情做到了炉火纯青. 因为Unix认为”一切皆文件”, 那么”打开的文件”就不仅仅是传统意义上打开的文件了, 还可以是网络/Unix域套接字, 匿名/具名管道, 共享库文件, 目录文件, 设备文件等等. 很多场景下, 查看进程或系统打开的文件会给调试带来极大的帮助. 下面简单地介绍lsof常被使用的功能选项.
- lsof : 简单地执行lsof会列出当前系统中所有被打开的文件, 但为了看到完整的信息, 通常需要具有root权限;
- lsof -u dutor : 列出用户dutor打开的文件, 可指定多个用户, 默认是OR的关系;
- lsof -c tair : 列出名称以tair开头的进程打开的文件, c for command, 可指定多个;
- lsof -c /^t.*r$/ : 列出名称以t开头, r结尾的进程打开的文件;
- lsof -p 12315 : 列出进程号为12315的进程打开的文件, 可指定多个;
- lsof server.log : 列出打开server.log文件的进程, 可指明多个文件;
- lsof . : 列出打开当前目录的进程;
- lsof +D . : 递归地列出当前目录中被打开的文件, 当然也可以lsof | grep `pwd`;
- lsof -i : 列出打开的套接字;
- lsof -i tcp : 列出打开的tcp套接字;
- lsof -i :5198 : 列出打开5198端口的进程;
- lsof -i :ssh : 列出打开22端口的进程;
- lsof -i tcp:5198 : 列出打开5198号tcp端口的进程;
- lsof -U : 列出打开Unix域套接字的进程;
- lsof -d 0-2 : 列出在0到2文件描述符上打开文件的进程;
- lsof -d mem : 列出打开映射文件的进程;
- lsof -d txt : 列出打开的可执行文件.
还有其他一些非常有用的选项, 可以对lsof的行为进行控制.
- lsof -a: 上述功能性选项可以组合使用, 但默认采用OR逻辑列出, -a选项令lsof使用AND逻辑;
- lsof -t: 只列出进程号, 可以借此得到特定的进程列表, 以方便对这些进程的自动处理, 比如kill `lsof -t -i :5198`会杀死所有打开5198端口的进程;
- lsof -r [seconds]: -r选项可以让lsof以一定的时间间隔连续执行, 在监视文件/进程时会非常实用.
这只是一个实用的不完全选项的罗列, 如果你知道其他非常实用的选项, 还望留言分享之.
祝好