lsof(List Open Files)是一个用于显示系统当前打开文件的工具,可以查看系统中哪些文件被打开,哪些进程打开了这些文件,以及这些文件被使用的情况等。lsof可以帮助系统管理员和程序员及时发现问题,比如查看系统中占用磁盘空间较多的文件,找出哪些文件正在被某个进程占用等。
lsof的基本用法格式为:lsof [选项] [文件路径]
下面给出一些lsof的常用选项及例子:
1. 显示所有进程打开的文件,加more或者grep来过滤
lsof|more
# lsof |more
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 252,1 4096 2 /
systemd 1 root rtd DIR 252,1 4096 2 /
systemd 1 root txt REG 252,1 1620224 1051400 /usr/lib/systemd/systemd
systemd 1 root mem REG 252,1 1369384 1064234 /usr/lib/x86_64-linux-gnu/libm-2.31.so
systemd 1 root mem REG 252,1 178528 1048921 /usr/lib/x86_64-linux-gnu/libudev.so.1.6.17
systemd 1 root mem REG 252,1 1575112 1051694 /usr/lib/x86_64-linux-gnu/libunistring.so.2.1.0
systemd 1 root mem REG 252,1 137584 1051558 /usr/lib/x86_64-linux-gnu/libgpg-error.so.0.28.0
systemd 1 root mem REG 252,1 67912 1051584 /usr/lib/x86_64-linux-gnu/libjson-c.so.4.0.0
字段说明
-
COMMAND:命令
-
PID:进程ID
-
PPID:父进程ID
-
USER:进程所有者
-
PGID:进程所属组
-
FD:文件描述符,文件描述符,cwd(应用程序的当前工作目录)、txt(程序代码)、mem(内存映射文件)等
-
TYPE:文件类型,如 DIR(目录)、CHR(字符类型)、REG(常规)
-
等,
-
DEVICE:设备编号
-
SIZE:文件的大小
-
NODE:索引节点(文件在磁盘上的标识)
-
NAME:打开文件的确切名称
2. 显示指定目录下的打开文件
lsof /var/log/messages
3. 查看指定进程所打开的文件
lsof -p 10 (根据进程号)
lsof -c sshd (根据进程名)
4. 查找指定用户打开的文件
lsof -u username
5. 查找某个端口被哪个进程占用
lsof -i :port
lsof -i :53
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 507 systemd-resolve 12u IPv4 18449 0t0 UDP localhost:domain
systemd-r 507 systemd-resolve 13u IPv4 18450 0t0 TCP localhost:domain (LISTEN)
6. 列出所有使用TCP和UDP协议的网络连接
lsof -i tcp
lsof -i udp
7. 显示指定文件的相关进程
lsof /file
8. 查找已被删除但仍被进程占用的文件,这个可以用来恢复删除文件
lsof | grep deleted
9. 列出所有的网络连接
lsof -i
10. 递归列出某目录下所有打开的文件
lsof +D /path/to/directory |more
需要注意的是,lsof需要以root权限运行才能查看所有系统进程和文件,否则只能查看当前用户的进程和文件。
总的来说,lsof是一个功能强大的工具,能够帮助系统管理员及时发现问题,定位文件打开问题,优化系统性能等。通过掌握lsof的用法,可以更好地管理系统资源,提高系统的稳定性和安全性