Linux洞察博客:lsof命令详解

介绍
欢迎👋来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。
lsof
lsof代表"list open files"(列出打开的文件)。它是Unix/Linux系统上一个强大的命令行工具,可以显示哪些进程打开了哪些文件、用户、端口、特定进程等等。在Linux中,一切都被视为文件,所以了解如何列出特定文件很重要。
让我们动手实践代码
CTRL + Alt + T打开您的终端。
检查所有打开的文件
  1. @Ankur:~$ lsof
  2. COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. systemd 1 root cwd unknown /proc/1/cwd (readlink: Permission denied)
  4. systemd 1 root rtd unknown /proc/1/root (readlink: Permission denied)
  5. systemd 1 root txt unknown ...
bash
您将获得一个很长的文件列表,显示当前在您的文件系统上打开的所有文件。
检查使用特定文件的进程
  1. Ankur:~$ lsof /file/path
bash
检查使用给定端口的文件
  1. Ankur:~$ lsof -i :3000
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. node 3452 ankur 21u IPv4 44686 0t0 TCP localhost:3000 (LISTEN)
bash
检查特定进程打开的文件
  1. @Ankur:~$ lsof -p 3452
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. node 3452 ankur cwd DIR 8,64 4096 43479 /home/ankur/node-webserver
  4. node 3452 ankur rtd DIR 8,64 4096 2 /
  5. ...
bash
检查开放的网络连接
  1. Ankur:~$ lsof -i
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. node 3717 ankur 21u IPv4 52033 0t0 TCP localhost:3000 (LISTEN)
bash
显示当前使用互联网连接的进程
  1. Ankur:~$ lsof -P -i -n
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. node 3725 ankur 21u IPv4 44727 0t0 TCP 127.0.0.1:3000 (LISTEN)
bash
列出所有监听端口以及相关进程的PID
  1. Ankur:~$ lsof -Pan -i tcp -i udp
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. node 3725 ankur 21u IPv4 44727 0t0 TCP 127.0.0.1:3000 (LISTEN)
bash
显示所有开放端口
  1. Ankur:~$ lsof -Pnl -i
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. node 3725 1000 21u IPv4 44727 0t0 TCP 127.0.0.1:3000 (LISTEN)
bash
列出特定命令打开的所有文件
  1. @Ankur:~$ lsof -c "node"
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. node 3725 ankur cwd DIR 8,64 4096 43479 /home/ankur/node-webserver
  4. node 3725 ankur rtd DIR 8,64 4096 2 /
  5. ...
bash
显示10个最大的打开文件
  1. Ankur:~$ lsof / | \
  2. awk '{ if($7 > 1048576) print $7/1048576 "MB" " " $9 " " $1 }' | \
  3. sort -n -u | tail | column -t
  4. 0MB NAME COMMAND
  5. 1.37904MB /usr/bin/bash bash
  6. 2.02687MB /usr/lib/x86_64-linux-gnu/libc.so.6 sh
  7. 2.47214MB /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.33 node
  8. 5.05953MB /usr/lib/x86_64-linux-gnu/libcrypto.so.3 sort
  9. 114.61MB /home/ankur/.nvm/versions/node/v22.14.0/bin/node node
bash
显示进程的当前工作目录
  1. Ankur:~$ lsof -p 3725 | grep cwd
  2. node 3725 ankur cwd DIR 8,64 4096 43479 /home/ankur/node-webserver
bash
🎉 您已经掌握了
现在您已经学会了如何使用lsof命令像专业人士一样检查打开的文件、网络端口和运行中的进程。是时候打开您的终端并在自己的系统上尝试这些命令了。玩玩看,探索一下,看看您的机器内部发生了什么。发现了一些很酷或意想不到的东西吗?在下面的评论中分享您的发现或最喜欢的lsof技巧!
常用参数说明
参数
说明
-i
显示网络连接
-p
指定进程ID
-c
指定命令名
-u
指定用户名
-P
不解析端口名
-n
不解析主机名
-l
显示用户ID而不是用户名
实际应用场景
1. 调试端口占用问题
  1. # 查看哪个进程占用了8080端口
  2. lsof -i :8080
bash
2. 查找文件被哪个进程锁定
  1. # 查看特定文件被哪些进程使用
  2. lsof /path/to/file
bash
3. 监控网络连接
  1. # 查看所有TCP连接
  2. lsof -i tcp
bash
4. 分析进程资源使用
  1. # 查看特定进程打开的所有文件
  2. lsof -p <PID>
bash