在大多数 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
用户、数据库和(客户端)主机项目在客户端连接的生命周期内保持不变,但活动指示符会更改。活动可以是 idle
(即,等待客户端命令)、idle in transaction
(在 BEGIN
块内等待客户端)或命令类型名称,例如 SELECT
。此外,如果服务器进程当前正在等待另一个会话持有的锁,则会附加 waiting
。在上述示例中,我们可以推断出进程 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
命令行。