如何查看系统中 PostgreSQL 数据库的进程(postgres)运行状态?

PostgreSQL 运行状态排查方法整理

在运维或排查 PostgreSQL 数据库问题时,通常需要从进程层面网络层面应用层面 进行综合判断。以下是三种常用方法的详细说明。


方法一:使用 ps 查看 PostgreSQL 进程树

命令

bash 复制代码
ps -axjf | grep postgres

命令拆解

组件 作用 详细解释
ps Process Status(进程状态) 列出系统中正在运行的进程。
-a All(全部) 显示所有用户的所有进程(不包括会话领头进程)。
-x eXtra(额外) 包含没有控制终端(TTY)的进程,常用于显示守护进程。
-j Job(作业) 显示作业控制信息(如进程组 ID)。
-f Full(完整) 以完整格式显示进程信息,包含命令行参数。
` ` 管道
grep postgres 过滤 筛选出包含 "postgres" 关键字的行。

为什么使用 -axjf ?

  • 显示完整命令行参数 :可看到子进程如何被主进程 fork 出来(如 -c config_file=...)。
  • 展示父子关系 :输出包含 PPID 或树形结构,便于确认进程归属。
  • 涵盖所有进程:包括无终端关联的后台守护进程,符合 PostgreSQL 的运行特征。

典型输出示例

bash 复制代码
$ ps -axjf | grep postgres
  1000   0   0   0  0  0 1000   1   0   0 -  0   0  0.0  0.0  0:00.01 ?        0:00 {postgres} /usr/lib/postgresql/15/bin/postgres -D /var/lib/postgresql/15/main -c config_file=/etc/postgresql/15/main/postgresql.conf
  1000   0   0   0  0  0 1000   2   0   0 -  0   0  0.0  0.0  0:00.02 ?        0:00   \_ postgres: checkpointer process
  1000   0   0   0  0  0 1000   3   0   0 -  0   0  0.0  0.0  0:00.01 ?        0:00   \_ postgres: writer process
  1000   0   0   0  0  0 1000   4   0   0 -  0   0  0.0  0.0  0:00.00 ?        0:00   \_ postgres: wal writer process
  1000   0   0   0  0  0 1000   5   0   0 -  0   0  0.0  0.0  0:00.00 ?        0:00   \_ postgres: autovacuum launcher process
  1000   0   0   0  0  0 1000   6   0   0 -  0   0  0.0  0.0  0:00.00 ?        0:00   \_ postgres: stats collector process
  1000   0   0   0  0  0 1000   7   0   0 -  0   0  0.0  0.0  0:00.00 ?        0:00   \_ postgres: logical replication launcher process

注意事项

  • 过滤局限性grep postgres 可能匹配到 grep 自身。建议使用:
bash 复制代码
  ps -axjf | grep -w postgres
  • 查看特定进程详情
bash 复制代码
ps -p 1000 -o pid,ppid,cmd,%cpu,%mem 

小结

该命令是 DBA 排查 PostgreSQL 状态的常用手段,不仅能确认数据库是否运行,还能验证各后台进程(如 wal writerautovacuum)是否正常启动,并归属同一实例。


方法二:使用 ss 查看端口监听情况

命令

bash 复制代码
ss -tnlp | grep ':5432'

注:若 PostgreSQL 使用非默认端口(如 5555),请替换为实际端口号。

命令拆解

组件 含义 说明
ss Socket Statistics 查看网络连接的现代工具,比 netstat 更快。
-t TCP 仅显示 TCP 连接。
-n Numeric 直接显示 IP 和端口号(不解析域名)。
-l Listening 仅显示监听状态的套接字。
-p Process 显示监听该端口的进程(PID/程序名)。
grep ':5432' 过滤 保留包含 :5432 的行。

预期输出示例

bash 复制代码
tcp    LISTEN   0   128   0.0.0.0:5432    0.0.0.0:*   users:(("postgres",pid=1234,fd=6))
  • tcp:协议类型。
  • LISTEN:端口处于监听状态。
  • 0.0.0.0:5432:监听所有接口的 5432 端口。
  • users:(("postgres",pid=1234,fd=6))
    • 进程名:postgres
    • PID:1234
    • fd:文件描述符(内部标识)

适用场景

  • 快速验证 PostgreSQL 是否在监听预期端口。
  • 定位占用端口的具体进程。

方法三:使用 pg_ctl 检查 PostgreSQL 实例状态(官方方式)

命令

bash 复制代码
sudo -u postgres /usr/local/pgsql/bin/pg_ctl -D /pgccc/pgdata status

路径 /usr/local/pgsql/bin/pg_ctl 和数据目录 /pgccc/pgdata 需根据实际安装路径调整。

命令拆解

组件 含义 说明
sudo -u postgres 切换用户 PostgreSQL 应由专用 postgres 用户运行。
/usr/local/pgsql/bin/pg_ctl 控制工具 PostgreSQL 官方提供的管理工具。
-D /pgccc/pgdata 数据目录 指定 PostgreSQL 实例的数据存储路径。
status 操作指令 查询实例当前运行状态。

预期输出

  • 运行中
bash 复制代码
pg_ctl: server is running (PID: 5678)
  • 未运行
bash 复制代码
pg_ctl: no server running

优势与局限

  • 最准确:直接反映 PostgreSQL 内部状态。
  • 依赖路径 :必须知道正确的 pg_ctl 路径和数据目录。
  • 极端情况 :若进程崩溃但端口仍被占用,需结合 ss 判断。

方法对比与推荐排查顺序

方法 适用层面 优点 局限
ss 网络层 快速验证端口是否开放,直接关联 PID 无法判断服务内部是否健康
pg_ctl status 应用层 官方工具,结果权威可靠 需知道数据目录路径
ps -axjf 进程层 展示完整进程树,验证子进程状态 无法直接确认端口或服务逻辑状态

推荐排查流程

  1. 先用 ss :确认 5432 端口是否被监听。
  2. 再用 pg_ctl status :确认 PostgreSQL 实例是否真正运行。
  3. 辅以 ps -axjf:深入分析进程结构,排查异常子进程。

三者结合,可全面覆盖 "端口 → 进程 → 服务状态" 的排查链路。

相关推荐
ChaITSimpleLove2 小时前
PostgreSQL 部署与运维常用命令详解
运维·数据库·postgresql·部署·命令解析
ChaITSimpleLove2 小时前
PostgreSQL 的 SQL 执行过程详解
数据库·sql·postgresql·词法分析·语法分析·执行过程
小鸡脚来咯2 小时前
SQL表连接
java·开发语言·数据库
Henray20242 小时前
SQL 窗口函数
大数据·数据库·sql
顶点多余2 小时前
Mysql--索引的操作
数据库·mysql
RDCJM2 小时前
Neo4j图数据库学习(二)——SpringBoot整合Neo4j
数据库·学习·neo4j
杀神lwz2 小时前
MongoDB入门+深入(三)--mongdbSql
数据库·mongodb
枫叶丹42 小时前
复杂SQL性能突围:代价驱动的连接条件下推策略与工程实践
数据库·sql·金仓数据库
聆风吟º2 小时前
直击复杂 SQL 瓶颈:金仓基于代价的连接条件下推技术落地
java·数据库·sql·kingbasees