实用linux命令-lsof
lsof命令简介
lsof
(List Open Files)是一个非常强大的工具,用于显示当前系统中被打开的文件信息。由于在Linux中几乎所有内容都是文件(包括普通文件、目录、套接字、管道、设备等),lsof
的作用非常广泛,可用于系统监控、故障排查和安全审计等场景。
lsof常见用法
查看所有打开的文件
lsof
1说明:
- 不带参数时,显示所有进程打开的所有文件。
- 输出可能非常多,通常需要结合过滤命令使用。
查看被某个进程打开的文件
lsof -p <PID>
1说明:
<PID>
:指定进程ID。- 列出该进程打开的所有文件,包括普通文件、目录、库文件等。
查看某个文件被哪些进程打开
lsof <文件路径>
1说明:
- 显示打开该文件的所有进程信息。
- 对于排查文件锁定或无法删除文件的情况很有用。
查看某个端口被哪个进程占用
lsof -i:<端口号>
1说明:
<端口号>
:指定端口号。- 常用于排查端口占用问题,如确认服务是否正在运行。
查看所有网络连接
lsof -i
1说明:
- 显示所有与网络相关的文件,包括TCP、UDP连接。
- 可以看到每个连接的本地地址、远程地址、状态等信息。
列出某用户打开的文件
lsof -u <用户名>
1说明:
<用户名>
:指定用户名。- 列出该用户打开的所有文件,可用于监控用户活动。
lsof高级用法
查看特定类型的文件
lsof -d <文件描述符>
1说明:
<文件描述符>
可以是数字或名称,如cwd
(当前工作目录)、txt
(程序代码)、mem
(内存映射文件)。- 例如:
lsof -d cwd
查看所有进程的当前工作目录。
监控文件的实时变化
watch -n 1 'lsof <文件路径>'
1说明:
- 每秒钟刷新一次,实时监控文件的打开情况。
- 对于排查文件访问问题非常有用。
查看某进程的网络连接
lsof -p <PID> -i
1说明:
- 结合
-p
和-i
选项,显示指定进程的所有网络连接。 - 可以精确了解某应用程序的网络活动。
- 结合
按协议过滤网络连接
lsof -i <协议>
1说明:
<协议>
可以是tcp
或udp
。- 例如:
lsof -i tcp
只显示TCP连接。
查看特定网络地址的连接
lsof -i@<主机名或IP>
1说明:
- 过滤显示与特定主机相关的连接。
- 例如:
lsof -i@192.168.1.1
显示与该IP相关的所有连接。
杀死占用某文件的进程
kill -9 $(lsof -t <文件路径>)
1说明:
-t
选项只输出进程ID,结合kill
命令可以快速终止占用文件的进程。- 在无法删除或修改文件时特别有用。
lsof与其他工具的配合
与grep结合使用
lsof | grep <关键词>
1说明:
- 通过关键词过滤
lsof
的输出结果,提高查找效率。 - 例如:
lsof | grep '/var/log'
查找打开日志目录文件的进程。
- 通过关键词过滤
与网络工具对比
lsof -i
与netstat
、ss
命令功能有重叠,但lsof
提供了更多与进程相关的信息。- 对于网络连接排查,可以根据具体需求选择最合适的工具。
与文件系统工具结合
lsof +D <目录路径>
1说明:
- 递归显示指定目录下被打开的所有文件。
- 例如:
lsof +D /var/www
查看Web目录下所有被访问的文件。
lsof注意事项
权限要求
- 普通用户只能查看自己拥有权限的进程和文件信息。
- 使用
sudo
或root用户可以查看系统中所有的文件打开情况。
性能影响
lsof
需要扫描整个系统的文件表,在大型系统上可能会消耗较多资源。- 建议在必要时使用,并尽可能使用过滤条件限制输出范围。
输出格式
lsof
的默认输出包含多列信息,可使用-F
选项生成更易于脚本处理的格式。- 使用
-l
选项可以显示用户ID而非用户名,提高处理速度。
上次更新: 4/24/2025