Featured image of post linux根据端口号查应用进程和服务

linux根据端口号查应用进程和服务

1. 查看哪个进程占用了端口

使用 netstat 或 ss

netstat -apln | grep 5432
# 更现代的 netstat 替代品 ss
ss -apln | grep 54321
  • -a 显示所有套接字和监听队列。这个选项会列出所有的TCP和UDP连接,无论它们是正在监听、已建立还是其他状态。
  • -p 显示监听套接字的程序名称和进程ID。这个选项会为每个套接字显示一个与之关联的进程名称,以及该进程的ID。
  • -l 表示仅显示监听状态的端口。监听状态意味着套接字正在等待接受来自客户端的连接请求。
  • -n 表示使用数字格式显示端口号。不解析主机名、端口名或用户名,显示数字形式的地址和端口号。这可以加快命令的执行速度,因为不需要进行DNS查询或其他名称解析。
# 这里使用 ss 的输出结果
u_str LISTEN 0      200                  /var/run/postgresql/.s.PGSQL.5432 1019                   * 0    users:(("postgres",pid=475,fd=8))
tcp   LISTEN 0      200                                            0.0.0.0:5432             0.0.0.0:*    users:(("postgres",pid=475,fd=6))
tcp   LISTEN 0      200                                               [::]:5432                [::]:*    users:(("postgres",pid=475,fd=7))
  1. 第一行

    • u_str LISTEN:这是一个 Unix 域套接字(u_str),当前状态是 LISTEN,表示该套接字正在监听连接请求。
    • 0:接收缓冲区的大小(不适用,因为这里是 Unix 域套接字)。
    • 200:接收缓冲区的大小限制。
    • /var/run/postgresql/.s.PGSQL.5432:与该套接字关联的 Unix 域套接字文件的路径。
    • 1019:进程 ID,表示正在监听该端口的 PostgreSQL 进程。
    • *:表示所有网络接口。
    • 0:发送缓冲区的大小。
    • users:(("postgres",pid=475,fd=8)):关联的用户信息,这里是 “postgres” 用户,进程 ID 为 475,文件描述符(fd)为 8。
  2. 第二行

    • tcp LISTEN:这是一个 TCP 网络套接字,当前状态是 LISTEN。
    • 0.0.0.0:5432:监听所有 IPv4 地址上的端口 5432。
    • 0.0.0.0:*:IPv6 地址被省略,* 表示所有 IPv6 地址。
    • users:(("postgres",pid=475,fd=6)):关联的用户信息,与第一行相同,但文件描述符(fd)为 6。
  3. 第三行

    • tcp LISTEN:同第二行,这是一个 TCP 网络套接字。
    • [::]:5432:监听所有 IPv6 地址上的端口 5432。
    • [::]:*:IPv4 地址被省略,* 表示所有 IPv4 地址。
    • users:(("postgres",pid=475,fd=7)):关联的用户信息,与前两行相同,但文件描述符(fd)为 7。 可以看到占用 5432 端口的PID 为 475

也可以使用 lsof 进行查询

lsof 命令(list open files)可以列出当前系统中打开的所有文件,包括网络端口。这里同样查看一下 5432 端口的占用情况

lsof -i:5432

输出:

COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
postgres 475 postgres    6u  IPv4   1017      0t0  TCP *:postgresql (LISTEN)
postgres 475 postgres    7u  IPv6   1018      0t0  TCP *:postgresql (LISTEN)
  1. COMMAND:进程的名称或命令行。
  2. PID:进程标识符(Process ID),是一个唯一的数字,用于标识系统中的进程。
  3. USER:运行进程的用户名称。
  4. FD:文件描述符(File Descriptor),是一个非负整数,代表进程打开的文件或套接字。
  5. TYPE:套接字类型,例如 IPv4 或 IPv6。
  6. DEVICE:设备名称,对于网络套接字,这通常是 “lo”(本地环回)或其他网络接口。
  7. SIZE/OFF:这是套接字缓冲区的大小或偏移量,“0t0” 表示传输层头部的大小是 0,偏移量也是 0。
  8. NODE:节点名称,对于网络套接字,这通常是 “*:",表示监听所有可用的网络接口上的特定端口。
  9. NAME:套接字的名称或状态,这里显示为 “LISTEN”,表示该套接字处于监听状态,准备接受传入的连接。

对于这两行输出:

  • 第一行显示了一个由用户 “postgres” 运行的进程,进程ID 同样为 475,正在监听 IPv4 套接字上的 PostgreSQL 数据库端口(默认为 5432)。
  • 第二行是相同的进程,但它显示的是 IPv6 套接字。这意味着 PostgreSQL 数据库服务器也配置为在 IPv6 地址上监听相同的端口。

2. 根据查出的进程号查询相应的服务

ps -ef | grep 475
  • -e 选项告诉 ps 显示所有进程(every process)。
  • -f 选项表示全格式(full format),它提供了一个扩展的列表,包括与每个进程相关的额外信息,如父进程 ID(PPID)和用户 ID(UID)等。 输出为:
postgres     475       1  0 Apr07 ?        00:00:24 /usr/lib/postgresql/16/bin/postgres -D /var/lib/postgresql/16/main -c config_file=/etc/postgresql/16/main/postgresql.conf
  1. postgres:这是正在运行的进程的命令名称。在这个例子中,它表明进程是 PostgreSQL 数据库服务器。

  2. 475:这是进程标识符(PID),它是操作系统分配给每个正在运行的进程的唯一数字。你可以通过这个 PID 来管理和监控进程。

  3. 1:这是进程的父进程标识符(PPID),它表示启动当前进程的父进程的 PID。在这个例子中,父进程的 PID 是 1,这通常意味着父进程是由系统初始化进程(init 或 systemd)启动的。

  4. 0:这是进程的 CPU 使用率。在这个例子中,它是 0,表示进程当前没有使用 CPU 资源。

  5. Apr07:这是进程启动的日期。在这个例子中,进程在 4 月 7 日启动。

  6. ?:这通常是进程的终端标识符,但在这里显示为问号,表示进程没有关联的终端。

  7. 00:00:24:这是进程自启动以来占用的 CPU 时间。在这个例子中,进程占用了 24 秒的 CPU 时间。

  8. /usr/lib/postgresql/16/bin/postgres:这是启动进程的可执行文件的完整路径。

  9. -D /var/lib/postgresql/16/main:这是传递给 postgres 命令的一个选项,指定了 PostgreSQL 数据库的数据目录。数据目录包含了所有的数据库文件,包括数据表、索引和配置文件。

  10. -c config_file=/etc/postgresql/16/main/postgresql.conf:这是另一个命令行选项,指定了 PostgreSQL 数据库的配置文件。配置文件包含了数据库服务器的各种设置,如性能调优参数、安全设置等。