Стандартные инструменты Unix
Эта страница переведена при помощи нейросети GigaChat.
На большинстве платформ 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. Первый процесс, указанный здесь, является основным серверным процессом. Аргументы командной строки, показанные для него, совпадают с теми, которые использовались при его запуске. Следующие четыре процесса - это фоновые рабочие процессы, автоматически запущенные основным процессом. Фонового процесса «autovacuum launcher» в этом списке не будет, если автоочистка отключена в системе. Каждый из оставшихся процессов – это серверный процесс, обрабатывающий одно клиентское соединение. Каждый такой процесс устанавливает отображение своей командной строки в форме:
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
.