网站首页 > 技术文章 正文
介绍
欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。
lsof
lsof代表"list open files"(列出打开的文件)。它是Unix/Linux系统上一个强大的命令行工具,可以显示哪些进程打开了哪些文件、用户、端口、特定进程等等。在Linux中,一切都被视为文件,所以了解如何列出特定文件很重要。
让我们动手实践代码
按CTRL + Alt + T打开您的终端。
检查所有打开的文件
@Ankur:~$ lsof
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd unknown /proc/1/cwd (readlink: Permission denied)
systemd 1 root rtd unknown /proc/1/root (readlink: Permission denied)
systemd 1 root txt unknown ...
您将获得一个很长的文件列表,显示当前在您的文件系统上打开的所有文件。
检查使用特定文件的进程
Ankur:~$ lsof /file/path
检查使用给定端口的文件
Ankur:~$ lsof -i :3000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 3452 ankur 21u IPv4 44686 0t0 TCP localhost:3000 (LISTEN)
检查特定进程打开的文件
@Ankur:~$ lsof -p 3452
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 3452 ankur cwd DIR 8,64 4096 43479 /home/ankur/node-webserver
node 3452 ankur rtd DIR 8,64 4096 2 /
...
检查开放的网络连接
Ankur:~$ lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 3717 ankur 21u IPv4 52033 0t0 TCP localhost:3000 (LISTEN)
显示当前使用互联网连接的进程
Ankur:~$ lsof -P -i -n
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 3725 ankur 21u IPv4 44727 0t0 TCP 127.0.0.1:3000 (LISTEN)
列出所有监听端口以及相关进程的PID
Ankur:~$ lsof -Pan -i tcp -i udp
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 3725 ankur 21u IPv4 44727 0t0 TCP 127.0.0.1:3000 (LISTEN)
显示所有开放端口
Ankur:~$ lsof -Pnl -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 3725 1000 21u IPv4 44727 0t0 TCP 127.0.0.1:3000 (LISTEN)
列出特定命令打开的所有文件
@Ankur:~$ lsof -c "node"
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 3725 ankur cwd DIR 8,64 4096 43479 /home/ankur/node-webserver
node 3725 ankur rtd DIR 8,64 4096 2 /
...
显示10个最大的打开文件
Ankur:~$ lsof / | \
awk '{ if($7 > 1048576) print $7/1048576 "MB" " " $9 " " $1 }' | \
sort -n -u | tail | column -t
0MB NAME COMMAND
1.37904MB /usr/bin/bash bash
2.02687MB /usr/lib/x86_64-linux-gnu/libc.so.6 sh
2.47214MB /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33 node
5.05953MB /usr/lib/x86_64-linux-gnu/libcrypto.so.3 sort
114.61MB /home/ankur/.nvm/versions/node/v22.14.0/bin/node node
显示进程的当前工作目录
Ankur:~$ lsof -p 3725 | grep cwd
node 3725 ankur cwd DIR 8,64 4096 43479 /home/ankur/node-webserver
您已经掌握了
现在您已经学会了如何使用lsof命令像专业人士一样检查打开的文件、网络端口和运行中的进程。是时候打开您的终端并在自己的系统上尝试这些命令了。玩玩看,探索一下,看看您的机器内部发生了什么。发现了一些很酷或意想不到的东西吗?在下面的评论中分享您的发现或最喜欢的lsof技巧!
常用参数说明
参数说明-i显示网络连接-p指定进程ID-c指定命令名-u指定用户名-P不解析端口名-n不解析主机名-l显示用户ID而不是用户名
实际应用场景
1. 调试端口占用问题
# 查看哪个进程占用了8080端口
lsof -i :8080
2. 查找文件被哪个进程锁定
# 查看特定文件被哪些进程使用
lsof /path/to/file
3. 监控网络连接
# 查看所有TCP连接
lsof -i tcp
4. 分析进程资源使用
# 查看特定进程打开的所有文件
lsof -p <PID>
- 上一篇: Linux神器 gron:让 JSON 数据轻松玩转命令行!
- 下一篇: 常见文件系统格式有哪些
猜你喜欢
- 2025-08-06 聊天讨论 5 个终端技巧!加速你的代码开发效率
- 2025-08-06 Linux文本三剑客:grep/sed/awk组合技,文本处理难题轻松解决
- 2025-08-06 Linux面试最高频的5个基本问题
- 2025-08-06 Linux/unix中 grep 正则使用示例
- 2025-08-06 Linux如何自动释放缓存
- 2025-08-06 pdfgrep:PDF 文本搜索的强大工具
- 2025-08-06 java开发常用的Linux命令,高频的没你想象的多
- 2025-08-06 Linux系统中有关mount与umount命令的使用指引
- 2025-08-06 Linux进程管理
- 2025-08-06 Linux三剑客之sed命令详解,小白也能看得懂!
- 08-06中等生如何学好初二数学函数篇
- 08-06C#构造函数
- 08-06初中数学:一次函数学习要点和方法
- 08-06仓颉编程语言基础-数据类型—结构类型
- 08-06C++实现委托机制
- 08-06初中VS高中三角函数:从"固定镜头"到"360°全景",数学视野升级
- 08-06一文讲透PLC中Static和Temp变量的区别
- 08-06类三剑客:一招修改所有对象!类方法与静态方法的核心区别!
- 1531℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 692℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 536℃MySQL service启动脚本浅析(r12笔记第59天)
- 501℃启用MySQL查询缓存(mysql8.0查询缓存)
- 500℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 486℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 469℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 467℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (70)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)