欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

macos lsof 详解 AG chatgpt 有大用 有大大用

lsof 是一个在 Unix 和类 Unix 系统(包括 macOS)中非常有用的命令行工具,用于列出当前系统打开的文件。lsof 是 "list open files" 的缩写。在 Unix 系统中,几乎所有东西都被视为文件,包括普通文件、目录、网络套接字、管道、设备等。因此,lsof 可以显示与这些资源相关的信息。

基本用法

在 macOS 上,你可以直接在终端中运行 lsof 命令来查看当前系统打开的文件列表:

bash
lsof

这将输出一个包含所有打开文件的列表,每一行代表一个打开的文件,并显示以下信息:

  • COMMAND:使用该文件的进程名称。

  • PID:进程 ID。

  • USER:运行该进程的用户。

  • FD:文件描述符(File Descriptor),表示文件在进程中的引用方式。

  • TYPE:文件类型(如 REG 表示普通文件,DIR 表示目录,IPv4 表示 IPv4 套接字等)。

  • DEVICE:设备号。

  • SIZE/OFF:文件大小或偏移量。

  • NODE:文件的 inode 号。

  • NAME:文件的路径或名称。

常用选项

lsof 提供了许多选项来过滤和定制输出。以下是一些常用的选项:

  1. 列出特定用户打开的文件

    bash
    lsof -u username

    这将列出由 username 用户打开的所有文件。

  2. 列出特定进程打开的文件

    bash
    lsof -p PID

    这将列出由进程 ID 为 PID 的进程打开的所有文件。

  3. 列出特定文件或目录的打开情况

    bash
    lsof /path/to/file

    这将列出所有打开 /path/to/file 文件的进程。

  4. 列出特定端口打开的文件

    bash
    lsof -i :port

    这将列出所有使用指定 port 端口的网络连接。

  5. 列出所有网络连接

    bash
    lsof -i

    这将列出所有网络连接,包括 TCP 和 UDP。

  6. 列出所有打开的文件类型

    bash
    lsof -t

    这将列出所有打开文件的类型。

  7. 列出所有打开的文件并显示文件大小

    bash
    lsof -s

    这将列出所有打开的文件,并显示文件的大小。

  8. 列出所有打开的文件并显示文件状态

    bash
    lsof -S

    这将列出所有打开的文件,并显示文件的状态。

  9. 列出所有打开的文件并显示文件描述符

    bash
    lsof -d FD

    这将列出所有打开的文件,并显示文件描述符。

  10. 列出所有打开的文件并显示文件类型

    bash
    lsof -t TYPE

    这将列出所有打开的文件,并显示文件类型。

高级用法

  1. 结合 grep 过滤输出

    bash
    lsof | grep keyword

    这将列出所有打开的文件,并过滤出包含 keyword 的行。

  2. 结合 awk 提取特定字段

    bash
    lsof | awk '{print $1, $2, $9}'

    这将列出所有打开的文件,并只显示 COMMANDPID 和 NAME 字段。

  3. 结合 sort 和 uniq 统计打开文件的进程

    bash
    lsof | awk '{print $1}' | sort | uniq -c | sort -nr

    这将统计每个进程打开的文件数量,并按数量从高到低排序。

示例

  1. 查找哪个进程正在使用某个端口

    bash
    lsof -i :8080

    这将列出所有使用 8080 端口的进程。

  2. 查找某个用户打开的所有文件

    bash
    lsof -u john

    这将列出用户 john 打开的所有文件。

  3. 查找某个文件被哪些进程打开

    bash
    lsof /var/log/system.log

    这将列出所有打开 /var/log/system.log 文件的进程。

总结

lsof 是一个非常强大的工具,可以帮助你诊断系统问题、查找资源占用情况、监控网络连接等。通过结合不同的选项和工具,你可以灵活地使用 lsof 来满足各种需求。



lsof -iTCP -sTCP:LISTEN   详解

lsof 是一个用于列出当前系统打开文件的工具。在 Unix 和 Linux 系统中,几乎所有东西都被视为文件,包括网络连接、设备、管道等。lsof 命令可以显示与这些文件相关的进程信息。

命令详解:lsof -iTCP -sTCP:LISTEN

1. lsof 命令

lsof 是 "list open files" 的缩写,用于列出当前系统打开的文件及其相关信息。

2. -iTCP 选项

-iTCP 选项用于过滤出与 TCP 协议相关的网络连接。-i ( internet )选项用于指定网络地址或协议 ,TCP 表示只显示 TCP 协议的连接。

3. -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 是由以下两部分组成的:

1. s

  • s 是 state(状态) 的简写。

  • 在 lsof 中,-s 选项用于指定网络连接的状态(state),例如 LISTEN(监听)、ESTABLISHED(已建立连接)等。

2. TCP

  • TCP 表示协议类型,这里是 TCP 协议。

因此,sTCP 表示 TCP 协议的状态。在 -sTCP:LISTEN 中,LISTEN 是 TCP 连接的状态,表示该连接正在监听端口。

具体语法

bash
-s<protocol>:<state>
  • <protocol>: 协议类型,例如 TCPUDP 等。

  • <state>: 连接状态,例如 LISTENESTABLISHEDCLOSED 等。

示例

bash
lsof -iTCP -sTCP:LISTEN
  • 该命令会列出所有 TCP 协议 且 状态为 LISTEN(正在监听)的连接。

其他常见的 TCP 状态

  • 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 连接的命令。以下是对该命令的详细解析:


命令结构

bash
lsof -n -P -iTCP -sTCP:LISTEN

1. lsof

  • lsof 是 "list open files" 的缩写,用于列出系统中打开的文件及其相关信息。在 Unix/Linux 系统中,几乎所有资源(包括网络连接、设备、管道等)都被视为文件。

2. -n

  • 禁用主机名解析

  • 默认情况下,lsof 会尝试将 IP 地址解析为主机名。使用 -n 选项可以避免这种解析,直接显示 IP 地址,从而加快命令执行速度。

  • 例如,*:22 会直接显示为 0.0.0.0:22

3. -P

  • 禁用端口号解析

  • 默认情况下,lsof 会尝试将端口号解析为服务名称(例如,22 端口会显示为 ssh)。使用 -P 选项可以避免这种解析,直接显示端口号。

  • 例如,ssh 会直接显示为 22

4. -iTCP

  • 过滤 TCP 协议

  • -i 选项用于指定网络协议或地址,TCP 表示只显示与 TCP 协议相关的连接。

5. -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 端口。


使用场景

  1. 网络服务监控:

  • 查看哪些服务正在监听端口,确保服务正常运行。

  • 安全审计:

    • 检查是否有未授权的服务在监听端口,防止潜在的安全风险。

  • 故障排查:

    • 当网络服务无法连接时,检查服务是否在监听指定端口。


    总结

    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 选项。以下是详细对比:


    1. 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)
      

    2. 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 相关的打开文件和连接的命令。以下是对该命令的详细解析:


    命令结构

    bash
    lsof -iTCP:3306

    1. lsof

    • lsof 是 "list open files" 的缩写,用于列出系统中打开的文件及其相关信息。在 Unix/Linux 系统中,几乎所有资源(包括网络连接、设备、管道等)都被视为文件。

    2. -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 端口。


    使用场景

    1. MySQL 监控:

    • 3306 是 MySQL 数据库默认监听的端口。通过该命令可以检查 MySQL 是否正在运行,以及是否有客户端连接到数据库。

  • 端口占用排查:

    • 如果某个进程占用了 3306 端口,可以使用该命令找到具体的进程。

  • 安全审计:

    • 检查是否有未授权的连接使用 3306 端口,防止潜在的安全风险。


    总结

    lsof -iTCP:3306 是一个非常实用的命令,用于监控和排查与 TCP 端口 3306 相关的连接。通过该命令,可以快速了解哪些进程在使用 3306 端口,并判断其状态(监听、已建立连接等)。




    FD    10u   是什么意思

    在 lsof 命令的输出中,FD 列表示 文件描述符(File Descriptor),而 10u 是文件描述符的具体表示形式。以下是详细解析:


    1. 文件描述符(File Descriptor, FD)

    • 文件描述符是操作系统为每个进程打开的文件或资源分配的一个整数标识符。

    • 在 Unix/Linux 系统中,文件描述符用于标识打开的文件、网络连接、设备、管道等资源。

    • 文件描述符的值通常从 0 开始,依次递增。


    2. 10u 的含义

    • 10u 是文件描述符的具体表示形式,由两部分组成:

      • 10: 文件描述符的编号,这里是 10

      • u: 文件描述符的访问模式或类型,这里是 u

    文件描述符的访问模式(u 的含义)

    lsof 使用单个字母表示文件描述符的访问模式或类型。常见的字母及其含义如下:

    字母含义
    r文件以 只读 模式打开。
    w文件以 只写 模式打开。
    u文件以 读写 模式打开。
    c文件是当前进程的 当前工作目录
    t文件是 文本文件
    m文件是 内存映射文件
    0文件描述符是 标准输入(stdin)
    1文件描述符是 标准输出(stdout)
    2文件描述符是 标准错误(stderr)
    3+文件描述符是进程打开的其他文件或资源(如网络连接、设备等)。

    在 10u 中:

    • 10 表示文件描述符的编号。

    • u 表示该文件描述符以 读写 模式打开。


    3. 示例解析

    在 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)。


    4. 常见场景

    • 网络连接

      • 对于网络连接,FD 列通常以 u 结尾,表示该连接以读写模式打开。

      • 例如,10u 表示一个以读写模式打开的网络连接。

    • 文件操作

      • 对于文件操作,FD 列可能以 rw 或 u 结尾,分别表示只读、只写或读写模式。


    总结

    • FD 列表示文件描述符,用于标识进程打开的文件或资源。

    • 10u 表示文件描述符编号为 10,且以 读写 模式打开。

    • 在 lsof 的输出中,FD 列的值和模式可以帮助你了解进程如何访问文件或资源。



    句柄 是什么意思 

     

    句柄(Handle) 是计算机科学中的一个重要概念,通常用于 标识和管理资源。在不同的上下文中,句柄的具体含义可能有所不同,但其核心思想是 通过一个抽象的值来访问或操作某个资源


    1. 句柄的基本概念

    • 句柄是一个 抽象的值,通常是一个整数或指针,用于标识某个资源(如文件、内存、网络连接等)。

    • 句柄本身并不直接包含资源的数据,而是作为 访问资源的桥梁

    • 通过句柄,程序可以间接地操作资源,而无需直接管理资源的底层细节。


    2. 句柄的作用

    • 资源管理:操作系统或运行时环境通过句柄管理资源,避免程序直接操作底层资源。

    • 抽象接口:句柄提供了一种抽象的方式,使程序可以通过统一的接口访问不同类型的资源。

    • 安全性:句柄可以隐藏资源的底层细节,防止程序错误地修改或释放资源。


    3. 句柄的常见应用场景

    (1)文件句柄

    • 在操作系统中,文件句柄用于标识打开的文件。

    • 程序通过文件句柄对文件进行读写操作。

    • 例如,在 Unix/Linux 系统中,文件描述符(File Descriptor)就是一种文件句柄。

    (2)窗口句柄

    • 在图形用户界面(GUI)编程中,窗口句柄用于标识一个窗口。

    • 程序通过窗口句柄操作窗口(如移动、关闭、绘制等)。

    • 例如,在 Windows 系统中,HWND 是窗口句柄的类型。

    (3)内存句柄

    • 在内存管理中,句柄用于标识一块分配的内存。

    • 程序通过内存句柄访问或释放内存。

    • 例如,在 Windows API 中,HANDLE 可以用于标识内存块。

    (4)网络句柄

    • 在网络编程中,句柄用于标识一个网络连接。

    • 程序通过网络句柄发送或接收数据。

    • 例如,在 Unix/Linux 系统中,套接字(Socket)的文件描述符就是一种网络句柄。


    4. 句柄与指针的区别

    • 指针:直接指向内存地址,程序可以通过指针直接访问数据。

    • 句柄:是一个抽象的值,通常由操作系统或运行时环境管理,程序通过句柄间接访问资源。

    • 安全性:句柄比指针更安全,因为句柄隐藏了资源的底层细节,防止程序错误地操作资源。


    5. 句柄的示例

    (1)文件句柄(Unix/Linux)

    c
    int fd = open("example.txt", O_RDONLY);  // 打开文件,返回文件句柄 read(fd, buffer, size);                 // 通过文件句柄读取文件 close(fd);                              // 关闭文件句柄

    (2)窗口句柄(Windows)

    c
    HWND hwnd = CreateWindow(...);  // 创建窗口,返回窗口句柄 ShowWindow(hwnd, SW_SHOW);      // 通过窗口句柄显示窗口 DestroyWindow(hwnd);            // 销毁窗口句柄

    (3)网络句柄(Unix/Linux)

    c
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);  // 创建套接字,返回网络句柄 connect(sockfd, ...);                         // 通过网络句柄建立连接 close(sockfd);                                // 关闭网络句柄

    6. 句柄在 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 以读写模式打开。


    实际输出示例

    bash
    COMMAND   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 的简写,表示文件以读写模式打开。

     

     

    普通分类: