Стандартные инструменты Unix

В большинстве платформ Unix QHB изменяет заголовок своей команды, выводимый на экран программой ps, поэтому отдельные процессы сервера можно легко идентифицировать. Пример вывода:

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

(Допустимый формат вызова ps, как и детали отображаемой информации, отличаются на разных платформах. Этот пример приведен для одной из последних версий системы Linux.) Первым из перечисленных здесь процессов является процесс главного сервера. Выведенные для него аргументы команды те же, что использовались при запуске. Следующие четыре процесса являются фоновыми рабочими процессами, автоматически запускаемыми главным процессом. (Процесса «autovacuum launcher» (процесс запуска автовакуума) не будет в этом списке, если в системе выключена автоочистка.) Каждый из оставшихся процессов — это серверный процесс, обрабатывающий одно клиентское подключение. Для каждого такого процесса устанавливается отображение командной строки в виде

qhb: пользователь база_данных хост активность

Элементы пользователь, база данных и хост остаются неизменными на протяжении всего жизненного цикла клиентского соединения, а индикатор активности меняется. Он может принимать значение idle (т. е. ожидание команды клиента), idle in transaction (ожидание клиента внутри блока BEGIN) или имя типа команды, например SELECT. Кроме того, если в настоящее время серверный процесс ожидает освобождения блокировки, которую удерживает другой сеанс, то к индикатору активности добавляется waiting. В приведенном выше примере мы можем сделать вывод, что процесс 15606 ожидает, пока процесс 15610 завершит свою транзакцию и тем самым освободит некоторую блокировку. (Процесс 15610 должен быть блокирующим, потому что нет другого активного сеанса. В более сложных случаях для определения, кто кого блокирует, понадобилось бы обратиться к системному представлению pg_locks.)

Если установлен параметр instance_name, имя кластера также будет показано в выводе ps:

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


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

Если выключить параметр update_process_title, то индикатор активности не меняется; заголовок процесса устанавливается только один раз при запуске нового процесса. На некоторых платформах это существенно снижает затраты на выполнение команды, на других это влияние незначительно.

Совет
Solaris требует особого обращения. Вместо /bin/ps нужно использовать /usr/ucb/ps. Также нужно использовать не один, а два флага w. Кроме того, у исходного вызова команды qhb отображение статуса в ps должно быть короче, чем у предоставляемого каждым серверным процессом. Если не сделать все эти три вещи, выводом ps для каждого серверного процесса будет исходная командная строка qhb.