Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

27.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: writer process
postgres  15555  0.0  0.0  57536   916 ?        Ss   18:02   0:00 postgres: checkpointer process
postgres  15556  0.0  0.0  57536   916 ?        Ss   18:02   0:00 postgres: wal writer process
postgres  15557  0.0  0.0  58504  2244 ?        Ss   18:02   0:00 postgres: autovacuum launcher process
postgres  15558  0.0  0.0  17512  1068 ?        Ss   18:02   0:00 postgres: stats collector process
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: writer process
...

如果你已经关闭了update_process_title,那么活动指示器将不会被更新, 进程标题仅在新进程被启动的时候设置一次。在某些平台上这样做可以为每个命令节省可观的开销, 但在其它平台上却不明显。

提示: Solaris需要特别的处理。你必需使用/usr/ucb/ps 而不是/bin/ps。你还必需使用两个w标志,而不是一个。 另外,你对postgres命令的最初调用必须用一个比服务器进程提供的短的 ps状态显示。如果你没有满足全部三个要求,每个服务器进程的 ps输出将是原始的postgres命令行。