欢迎各位兄弟 发布技术文章
这里的技术是共享的
lsof
是一个在 Unix 和类 Unix 系统(包括 macOS)中非常有用的命令行工具,用于列出当前系统打开的文件。lsof
是 "list open files" 的缩写。在 Unix 系统中,几乎所有东西都被视为文件,包括普通文件、目录、网络套接字、管道、设备等。因此,lsof
可以显示与这些资源相关的信息。
在 macOS 上,你可以直接在终端中运行 lsof
命令来查看当前系统打开的文件列表:
bashlsof
这将输出一个包含所有打开文件的列表,每一行代表一个打开的文件,并显示以下信息:
COMMAND
:使用该文件的进程名称。
PID
:进程 ID。
USER
:运行该进程的用户。
FD
:文件描述符(File Descriptor),表示文件在进程中的引用方式。
TYPE
:文件类型(如 REG 表示普通文件,DIR 表示目录,IPv4 表示 IPv4 套接字等)。
DEVICE
:设备号。
SIZE/OFF
:文件大小或偏移量。
NODE
:文件的 inode 号。
NAME
:文件的路径或名称。
lsof
提供了许多选项来过滤和定制输出。以下是一些常用的选项:
列出特定用户打开的文件:
bashlsof -u username
这将列出由 username
用户打开的所有文件。
列出特定进程打开的文件:
bashlsof -p PID
这将列出由进程 ID 为 PID
的进程打开的所有文件。
列出特定文件或目录的打开情况:
bashlsof /path/to/file
这将列出所有打开 /path/to/file
文件的进程。
列出特定端口打开的文件:
bashlsof -i :port
这将列出所有使用指定 port
端口的网络连接。
列出所有网络连接:
bashlsof -i
这将列出所有网络连接,包括 TCP 和 UDP。
列出所有打开的文件类型:
bashlsof -t
这将列出所有打开文件的类型。
列出所有打开的文件并显示文件大小:
bashlsof -s
这将列出所有打开的文件,并显示文件的大小。
列出所有打开的文件并显示文件状态:
bashlsof -S
这将列出所有打开的文件,并显示文件的状态。
列出所有打开的文件并显示文件描述符:
bashlsof -d FD
这将列出所有打开的文件,并显示文件描述符。
列出所有打开的文件并显示文件类型:
bashlsof -t TYPE
这将列出所有打开的文件,并显示文件类型。
结合 grep
过滤输出:
bashlsof | grep keyword
这将列出所有打开的文件,并过滤出包含 keyword
的行。
结合 awk
提取特定字段:
bashlsof | awk '{print $1, $2, $9}'
这将列出所有打开的文件,并只显示 COMMAND
、PID
和 NAME
字段。
结合 sort
和 uniq
统计打开文件的进程:
bashlsof | awk '{print $1}' | sort | uniq -c | sort -nr
这将统计每个进程打开的文件数量,并按数量从高到低排序。
查找哪个进程正在使用某个端口:
bashlsof -i :8080
这将列出所有使用 8080 端口的进程。
查找某个用户打开的所有文件:
bashlsof -u john
这将列出用户 john
打开的所有文件。
查找某个文件被哪些进程打开:
bashlsof /var/log/system.log
这将列出所有打开 /var/log/system.log
文件的进程。
lsof
是一个非常强大的工具,可以帮助你诊断系统问题、查找资源占用情况、监控网络连接等。通过结合不同的选项和工具,你可以灵活地使用 lsof
来满足各种需求。
lsof -iTCP -sTCP:LISTEN 详解
lsof
是一个用于列出当前系统打开文件的工具。在 Unix 和 Linux 系统中,几乎所有东西都被视为文件,包括网络连接、设备、管道等。lsof
命令可以显示与这些文件相关的进程信息。
lsof -iTCP -sTCP:LISTEN
lsof
命令lsof
是 "list open files" 的缩写,用于列出当前系统打开的文件及其相关信息。
-iTCP
选项-iTCP
选项用于过滤出与 TCP 协议相关的网络连接。-i
( internet )选项用于指定网络地址或协议 ,TCP
表示只显示 TCP 协议的连接。
-sTCP:LISTEN
选项-sTCP:LISTEN
选项用于进一步过滤出处于 LISTEN
状态的 TCP 连接。-s
选项用于指定协议状态,TCP:LISTEN
表示只显示处于监听状态的 TCP 连接。
lsof -iTCP -sTCP:LISTEN
命令的作用是列出当前系统中所有处于监听状态的 TCP 连接及其相关信息。
执行 lsof -iTCP -sTCP:LISTEN
命令后,输出可能如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 root 3u IPv4 12345 0t0 TCP *:22 (LISTEN)
nginx 5678 www 6u IPv4 67890 0t0 TCP *:80 (LISTEN)
COMMAND: 打开文件的进程名称。
PID: 进程 ID。
USER: 运行进程的用户。
FD: 文件描述符(File Descriptor),表示进程打开的文件。
TYPE: 文件类型,IPv4
表示 IPv4 网络连接。
DEVICE: 设备号。
SIZE/OFF: 文件大小或偏移量。
NODE: 文件的 inode 号。
NAME: 文件名或网络地址和端口号,*:22
表示监听所有 IP 地址的 22 端口。
网络服务监控: 查看哪些服务正在监听端口,确保服务正常运行。
安全审计: 检查是否有未授权的服务在监听端口,防止潜在的安全风险。
故障排查: 当网络服务无法连接时,检查服务是否在监听指定端口。
lsof -iTCP -sTCP:LISTEN
是一个非常有用的命令,可以帮助你快速了解系统中哪些 TCP 服务正在监听端口,便于进行网络服务的管理和监控。
sTCP 其中 s是什么简写
在 lsof
命令中,-sTCP:LISTEN
选项中的 sTCP
是由以下两部分组成的:
s
s
是 state(状态) 的简写。
在 lsof
中,-s
选项用于指定网络连接的状态(state),例如 LISTEN
(监听)、ESTABLISHED
(已建立连接)等。
TCP
TCP
表示协议类型,这里是 TCP 协议。
因此,sTCP
表示 TCP 协议的状态。在 -sTCP:LISTEN
中,LISTEN
是 TCP 连接的状态,表示该连接正在监听端口。
bash-s<protocol>:<state>
<protocol>
: 协议类型,例如 TCP
、UDP
等。
<state>
: 连接状态,例如 LISTEN
、ESTABLISHED
、CLOSED
等。
bashlsof -iTCP -sTCP:LISTEN
该命令会列出所有 TCP 协议 且 状态为 LISTEN
(正在监听)的连接。
ESTABLISHED
: 已建立的连接。
SYN_SENT
: 发送了 SYN 请求,等待对方确认。
CLOSE_WAIT
: 等待关闭连接。
TIME_WAIT
: 连接关闭后,等待足够的时间以确保对方收到确认。
sTCP
中的 s
是 state(状态) 的简写,表示指定 TCP 连接的状态。在 lsof
中,-sTCP:LISTEN
用于过滤出所有处于监听状态的 TCP 连接。
# lsof -n -P -iTCP -sTCP:LISTEN 详解
lsof -n -P -iTCP -sTCP:LISTEN
是一个用于列出当前系统中所有处于监听状态的 TCP 连接的命令。以下是对该命令的详细解析:
bashlsof -n -P -iTCP -sTCP:LISTEN
lsof
lsof
是 "list open files" 的缩写,用于列出系统中打开的文件及其相关信息。在 Unix/Linux 系统中,几乎所有资源(包括网络连接、设备、管道等)都被视为文件。
-n
禁用主机名解析。
默认情况下,lsof
会尝试将 IP 地址解析为主机名。使用 -n
选项可以避免这种解析,直接显示 IP 地址,从而加快命令执行速度。
例如,*:22
会直接显示为 0.0.0.0:22
。
-P
禁用端口号解析。
默认情况下,lsof
会尝试将端口号解析为服务名称(例如,22 端口会显示为 ssh
)。使用 -P
选项可以避免这种解析,直接显示端口号。
例如,ssh
会直接显示为 22
。
-iTCP
过滤 TCP 协议。
-i
选项用于指定网络协议或地址,TCP
表示只显示与 TCP 协议相关的连接。
-sTCP:LISTEN
过滤 TCP 连接状态。
-s
选项用于指定协议状态,TCP:LISTEN
表示只显示处于监听状态(LISTEN
)的 TCP 连接。
lsof -n -P -iTCP -sTCP:LISTEN
的作用是列出当前系统中所有 处于监听状态的 TCP 连接,并且:
不解析主机名(直接显示 IP 地址)。
不解析端口号(直接显示端口号)。
执行该命令后,输出可能如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 root 3u IPv4 12345 0t0 TCP 0.0.0.0:22 (LISTEN)
nginx 5678 www 6u IPv4 67890 0t0 TCP 0.0.0.0:80 (LISTEN)
COMMAND: 打开文件的进程名称。
PID: 进程 ID。
USER: 运行进程的用户。
FD: 文件描述符(File Descriptor),表示进程打开的文件。
TYPE: 文件类型,IPv4
表示 IPv4 网络连接。
DEVICE: 设备号。
SIZE/OFF: 文件大小或偏移量。
NODE: 文件的 inode 号。
NAME: 文件名或网络地址和端口号,0.0.0.0:22
表示监听所有 IP 地址的 22 端口。
网络服务监控:
查看哪些服务正在监听端口,确保服务正常运行。
安全审计:
检查是否有未授权的服务在监听端口,防止潜在的安全风险。
故障排查:
当网络服务无法连接时,检查服务是否在监听指定端口。
lsof -n -P -iTCP -sTCP:LISTEN
是一个高效且实用的命令,用于快速查看系统中所有处于监听状态的 TCP 连接,并且避免了主机名和端口号的解析,适合在需要快速获取信息的场景中使用。
lsof -n -P -iTCP -sTCP:LISTEN 与 lsof -n -P -sTCP:LISTEN 区别
lsof -n -P -iTCP -sTCP:LISTEN
和 lsof -n -P -sTCP:LISTEN
这两个命令的核心区别在于 -iTCP
选项。以下是详细对比:
lsof -n -P -iTCP -sTCP:LISTEN
作用:列出当前系统中所有处于监听状态(LISTEN
)的 TCP 连接。
选项解析:
-n
:禁用主机名解析(直接显示 IP 地址)。
-P
:禁用端口号解析(直接显示端口号)。
-iTCP
:只显示与 TCP 协议 相关的连接。
-sTCP:LISTEN
:只显示 TCP 协议中状态为 LISTEN
(监听)的连接。
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 root 3u IPv4 12345 0t0 TCP 0.0.0.0:22 (LISTEN)
nginx 5678 www 6u IPv4 67890 0t0 TCP 0.0.0.0:80 (LISTEN)
lsof -n -P -sTCP:LISTEN
作用:列出当前系统中所有处于监听状态(LISTEN
)的连接,不限协议。
选项解析:
-n
:禁用主机名解析(直接显示 IP 地址)。
-P
:禁用端口号解析(直接显示端口号)。
-sTCP:LISTEN
:显示 TCP 协议 中状态为 LISTEN
(监听)的连接。
注意:这里的 -sTCP:LISTEN
仍然只针对 TCP 协议,因此实际效果与 lsof -n -P -iTCP -sTCP:LISTEN
几乎相同。
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 root 3u IPv4 12345 0t0 TCP 0.0.0.0:22 (LISTEN)
nginx 5678 www 6u IPv4 67890 0t0 TCP 0.0.0.0:80 (LISTEN)
-iTCP
选项:
lsof -n -P -iTCP -sTCP:LISTEN
明确指定了只显示 TCP 协议 的连接。
lsof -n -P -sTCP:LISTEN
虽然从语法上没有明确指定协议,但 -sTCP:LISTEN
仍然只针对 TCP 协议,因此实际效果与第一个命令相同。
lsof -n -P -iTCP -sTCP:LISTEN
:明确指定只显示 TCP 协议中处于监听状态的连接。
lsof -n -P -sTCP:LISTEN
:虽然没有明确指定协议,但由于 -sTCP:LISTEN
的作用,实际效果与第一个命令相同。
两者输出几乎一致,唯一的区别在于 -iTCP
的显式指定,但实际功能没有本质差异。
lsof -iTCP:3306 详解
lsof -iTCP:3306
是一个用于列出与 TCP 端口 3306 相关的打开文件和连接的命令。以下是对该命令的详细解析:
bashlsof -iTCP:3306
lsof
lsof
是 "list open files" 的缩写,用于列出系统中打开的文件及其相关信息。在 Unix/Linux 系统中,几乎所有资源(包括网络连接、设备、管道等)都被视为文件。
-iTCP:3306
-i
( internet )选项用于指定网络地址或协议。
TCP:3306
表示只显示与 TCP 协议 且 端口号为 3306 相关的连接。
该选项的作用是过滤出所有使用 3306 端口 的 TCP 连接(包括监听、已建立等状态)。
lsof -iTCP:3306
的作用是列出当前系统中所有与 TCP 端口 3306 相关的连接或打开的文件。
执行该命令后,输出可能如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1234 mysql 10u IPv4 12345 0t0 TCP *:3306 (LISTEN)
mysqld 1234 mysql 11u IPv4 56789 0t0 TCP 192.168.1.100:3306->192.168.1.200:54321 (ESTABLISHED)
COMMAND: 打开文件的进程名称。
PID: 进程 ID。
USER: 运行进程的用户。
FD: 文件描述符(File Descriptor),表示进程打开的文件。
TYPE: 文件类型,IPv4
表示 IPv4 网络连接。
DEVICE: 设备号。
SIZE/OFF: 文件大小或偏移量。
NODE: 文件的 inode 号。
NAME:
对于监听状态的连接:*:3306 (LISTEN)
表示监听所有 IP 地址的 3306 端口。
对于已建立连接的连接:192.168.1.100:3306->192.168.1.200:54321 (ESTABLISHED)
表示从 192.168.1.100
的 3306 端口连接到 192.168.1.200
的 54321 端口。
MySQL 监控:
3306 是 MySQL 数据库默认监听的端口。通过该命令可以检查 MySQL 是否正在运行,以及是否有客户端连接到数据库。
端口占用排查:
如果某个进程占用了 3306 端口,可以使用该命令找到具体的进程。
安全审计:
检查是否有未授权的连接使用 3306 端口,防止潜在的安全风险。
lsof -iTCP:3306
是一个非常实用的命令,用于监控和排查与 TCP 端口 3306 相关的连接。通过该命令,可以快速了解哪些进程在使用 3306 端口,并判断其状态(监听、已建立连接等)。
FD 10u 是什么意思
在 lsof
命令的输出中,FD
列表示 文件描述符(File Descriptor),而 10u
是文件描述符的具体表示形式。以下是详细解析:
文件描述符是操作系统为每个进程打开的文件或资源分配的一个整数标识符。
在 Unix/Linux 系统中,文件描述符用于标识打开的文件、网络连接、设备、管道等资源。
文件描述符的值通常从 0
开始,依次递增。
10u
的含义10u
是文件描述符的具体表示形式,由两部分组成:
10
: 文件描述符的编号,这里是 10
。
u
: 文件描述符的访问模式或类型,这里是 u
。
u
的含义)lsof
使用单个字母表示文件描述符的访问模式或类型。常见的字母及其含义如下:
字母 | 含义 |
---|---|
r | 文件以 只读 模式打开。 |
w | 文件以 只写 模式打开。 |
u | 文件以 读写 模式打开。 |
c | 文件是当前进程的 当前工作目录。 |
t | 文件是 文本文件。 |
m | 文件是 内存映射文件。 |
0 | 文件描述符是 标准输入(stdin)。 |
1 | 文件描述符是 标准输出(stdout)。 |
2 | 文件描述符是 标准错误(stderr)。 |
3 + | 文件描述符是进程打开的其他文件或资源(如网络连接、设备等)。 |
在 10u
中:
10
表示文件描述符的编号。
u
表示该文件描述符以 读写 模式打开。
在 lsof
的输出中,FD
列可能如下:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1234 mysql 10u IPv4 12345 0t0 TCP *:3306 (LISTEN)
10u
表示:
文件描述符编号为 10
。
该文件描述符以 读写 模式打开。
该文件描述符对应的是一个 IPv4 网络连接(TYPE
列为 IPv4
)。
网络连接:
对于网络连接,FD
列通常以 u
结尾,表示该连接以读写模式打开。
例如,10u
表示一个以读写模式打开的网络连接。
文件操作:
对于文件操作,FD
列可能以 r
、w
或 u
结尾,分别表示只读、只写或读写模式。
FD
列表示文件描述符,用于标识进程打开的文件或资源。
10u
表示文件描述符编号为 10
,且以 读写 模式打开。
在 lsof
的输出中,FD
列的值和模式可以帮助你了解进程如何访问文件或资源。
句柄 是什么意思
句柄(Handle) 是计算机科学中的一个重要概念,通常用于 标识和管理资源。在不同的上下文中,句柄的具体含义可能有所不同,但其核心思想是 通过一个抽象的值来访问或操作某个资源。
句柄是一个 抽象的值,通常是一个整数或指针,用于标识某个资源(如文件、内存、网络连接等)。
句柄本身并不直接包含资源的数据,而是作为 访问资源的桥梁。
通过句柄,程序可以间接地操作资源,而无需直接管理资源的底层细节。
资源管理:操作系统或运行时环境通过句柄管理资源,避免程序直接操作底层资源。
抽象接口:句柄提供了一种抽象的方式,使程序可以通过统一的接口访问不同类型的资源。
安全性:句柄可以隐藏资源的底层细节,防止程序错误地修改或释放资源。
在操作系统中,文件句柄用于标识打开的文件。
程序通过文件句柄对文件进行读写操作。
例如,在 Unix/Linux 系统中,文件描述符(File Descriptor)就是一种文件句柄。
在图形用户界面(GUI)编程中,窗口句柄用于标识一个窗口。
程序通过窗口句柄操作窗口(如移动、关闭、绘制等)。
例如,在 Windows 系统中,HWND
是窗口句柄的类型。
在内存管理中,句柄用于标识一块分配的内存。
程序通过内存句柄访问或释放内存。
例如,在 Windows API 中,HANDLE
可以用于标识内存块。
在网络编程中,句柄用于标识一个网络连接。
程序通过网络句柄发送或接收数据。
例如,在 Unix/Linux 系统中,套接字(Socket)的文件描述符就是一种网络句柄。
指针:直接指向内存地址,程序可以通过指针直接访问数据。
句柄:是一个抽象的值,通常由操作系统或运行时环境管理,程序通过句柄间接访问资源。
安全性:句柄比指针更安全,因为句柄隐藏了资源的底层细节,防止程序错误地操作资源。
cint fd = open("example.txt", O_RDONLY); // 打开文件,返回文件句柄 read(fd, buffer, size); // 通过文件句柄读取文件 close(fd); // 关闭文件句柄
cHWND hwnd = CreateWindow(...); // 创建窗口,返回窗口句柄 ShowWindow(hwnd, SW_SHOW); // 通过窗口句柄显示窗口 DestroyWindow(hwnd); // 销毁窗口句柄
cint sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字,返回网络句柄 connect(sockfd, ...); // 通过网络句柄建立连接 close(sockfd); // 关闭网络句柄
lsof
中的体现在 lsof
命令的输出中,FD
列(文件描述符)就是一种句柄。例如:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1234 mysql 10u IPv4 12345 0t0 TCP *:3306 (LISTEN)
10u
是文件描述符(句柄),用于标识一个打开的网络连接。
进程通过文件描述符 10
操作该网络连接。
句柄 是一个抽象的值,用于标识和管理资源。
句柄提供了一种间接访问资源的方式,隐藏了资源的底层细节。
在文件、窗口、内存、网络等场景中,句柄都扮演着重要的角色。
在 lsof
中,文件描述符(FD
)就是一种句柄,用于标识打开的文件或网络连接。
FD 列可能以 r、w 或 u 结尾,分别表示只读、只写或读写模式。 r是read 简写,,,w是write的简写,,,u是什么简写
在 lsof
命令的输出中,FD
列(文件描述符列)的结尾字母表示文件的访问模式。具体来说:
r
: 表示文件以 只读(read-only) 模式打开。
w
: 表示文件以 只写(write-only) 模式打开。
u
: 表示文件以 读写(read-write) 模式打开。
u
的含义u
是 update 的简写,表示文件以 读写模式 打开。这种模式允许程序同时读取和写入文件。
update
的含义是文件可以被 读取和更新(写入)。
在 Unix/Linux 系统中,O_RDWR
(Read-Write)标志用于以读写模式打开文件。
在 lsof
的输出中,FD
列可能如下:
10r
: 文件描述符 10
以只读模式打开。
20w
: 文件描述符 20
以只写模式打开。
30u
: 文件描述符 30
以读写模式打开。
bashCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 1234 mysql 10u IPv4 12345 0t0 TCP *:3306 (LISTEN) cat 5678 user 3r REG 8,1 123456 789 /path/to/file.txt logger 9101 root 1w CHR 1,3 0t0 456 /dev/null
10u
: 文件描述符 10
以读写模式打开,对应一个 TCP 连接。
3r
: 文件描述符 3
以只读模式打开,对应一个普通文件。
1w
: 文件描述符 1
以只写模式打开,对应 /dev/null
设备。
r
: 只读模式(read
)。
w
: 只写模式(write
)。
u
: 读写模式(update
),表示文件可以被读取和写入。
u
是 update
的简写,表示文件以读写模式打开。