Skip to content

28.1. 标准 Unix 工具#

在大多数 Unix 平台上,PostgreSQL会修改其命令标题,如ps所报告的那样,以便可以轻松识别各个服务器进程。一个示例显示是

$ ps auxww | grep ^postgres
postgres  15551  0.0  0.1  57536  7132 pts/0    S    18:02   0:00 postgres -i
postgres  15554  0.0  0.0  57536  1184 ?        Ss   18:02   0:00 postgres: background writer
postgres  15555  0.0  0.0  57536   916 ?        Ss   18:02   0:00 postgres: checkpointer
postgres  15556  0.0  0.0  57536   916 ?        Ss   18:02   0:00 postgres: walwriter
postgres  15557  0.0  0.0  58504  2244 ?        Ss   18:02   0:00 postgres: autovacuum launcher
postgres  15582  0.0  0.0  58772  3080 ?        Ss   18:04   0:00 postgres: joe runbug 127.0.0.1 idle
postgres  15606  0.0  0.0  58772  3052 ?        Ss   18:07   0:00 postgres: tgl regression [local] SELECT waiting
postgres  15610  0.0  0.0  58772  3056 ?        Ss   18:07   0:00 postgres: tgl regression [local] idle in transaction

ps的适当调用因不同的平台而异,显示内容的详细信息也因平台而异。此示例来自最近的 Linux 系统。)此处列出的第一个进程是主服务器进程。为其显示的命令参数与启动时使用的参数相同。接下来的四个进程是主进程自动启动的后台工作进程。(如果你已将系统设置为不运行自动清理,则““自动清理启动器””进程将不存在。)其余每个进程都是处理一个客户端连接的服务器进程。每个此类进程以以下形式设置其命令行显示

postgres: user database host activity

用户、数据库和(客户端)主机项在客户端连接的生命周期内保持不变,但活动指示器会发生变化。活动可以是空闲(即,等待客户端命令)、事务中空闲(等待BEGIN块内的客户端)或命令类型名称,如SELECT。此外,如果服务器进程当前正在等待其他会话持有的锁,则会附加等待。在上述示例中,我们可以推断出进程 15606 正在等待进程 15610 完成其事务,从而释放某个锁。(进程 15610 必须是阻塞者,因为没有其他活动会话。在更复杂的情况下,有必要查看pg_locks系统视图以确定谁在阻塞谁。)

如果已配置cluster_name,则群集名称也将显示在ps输出中

$ psql -c 'SHOW cluster_name'
 cluster_name
--------------
 server1
(1 row)

$ ps aux|grep server1
postgres   27093  0.0  0.0  30096  2752 ?        Ss   11:34   0:00 postgres: server1: background writer
...

如果您已关闭update_process_title,则不会更新活动指示器;仅在启动新进程时设置进程标题一次。在某些平台上,这节省了可衡量的每命令开销;在其他平台上,这无关紧要。

提示

Solaris需要特殊处理。您必须使用/usr/ucb/ps,而不是/bin/ps。您还必须使用两个w标志,而不仅仅是一个。此外,您对postgres命令的原始调用必须比每个服务器进程提供的ps状态显示更短。如果您未能同时完成所有三件事,则每个服务器进程的ps输出将是原始postgres命令行。