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))
第一行:
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。
第二行:
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。
第三行:
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)
- COMMAND:进程的名称或命令行。
- PID:进程标识符(Process ID),是一个唯一的数字,用于标识系统中的进程。
- USER:运行进程的用户名称。
- FD:文件描述符(File Descriptor),是一个非负整数,代表进程打开的文件或套接字。
- TYPE:套接字类型,例如 IPv4 或 IPv6。
- DEVICE:设备名称,对于网络套接字,这通常是 “lo”(本地环回)或其他网络接口。
- SIZE/OFF:这是套接字缓冲区的大小或偏移量,“0t0” 表示传输层头部的大小是 0,偏移量也是 0。
- NODE:节点名称,对于网络套接字,这通常是 “*:",表示监听所有可用的网络接口上的特定端口。
- 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
postgres:这是正在运行的进程的命令名称。在这个例子中,它表明进程是 PostgreSQL 数据库服务器。
475:这是进程标识符(PID),它是操作系统分配给每个正在运行的进程的唯一数字。你可以通过这个 PID 来管理和监控进程。
1:这是进程的父进程标识符(PPID),它表示启动当前进程的父进程的 PID。在这个例子中,父进程的 PID 是 1,这通常意味着父进程是由系统初始化进程(init 或 systemd)启动的。
0:这是进程的 CPU 使用率。在这个例子中,它是 0,表示进程当前没有使用 CPU 资源。
Apr07:这是进程启动的日期。在这个例子中,进程在 4 月 7 日启动。
?:这通常是进程的终端标识符,但在这里显示为问号,表示进程没有关联的终端。
00:00:24:这是进程自启动以来占用的 CPU 时间。在这个例子中,进程占用了 24 秒的 CPU 时间。
/usr/lib/postgresql/16/bin/postgres:这是启动进程的可执行文件的完整路径。
-D /var/lib/postgresql/16/main:这是传递给
postgres
命令的一个选项,指定了 PostgreSQL 数据库的数据目录。数据目录包含了所有的数据库文件,包括数据表、索引和配置文件。-c config_file=/etc/postgresql/16/main/postgresql.conf:这是另一个命令行选项,指定了 PostgreSQL 数据库的配置文件。配置文件包含了数据库服务器的各种设置,如性能调优参数、安全设置等。