优秀的编程知识分享平台

网站首页 > 技术文章 正文

Linux:lsof命令详解

nanyue 2025-08-06 22:07:10 技术文章 11 ℃

介绍

欢迎来到这篇博客。在这篇博客中,我们将学习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>
最近发表
标签列表