как красиво остановить все процессы postgres

33

Как приятно остановить все процессы postgres с помощью pg_ctl(или иным образом), если вы не помните, что такое каталог базы данных, и не определены переменные среды PGDATA?

матовый
источник

Ответы:

58

Это безопасно:

sudo pkill -u postgres

Это убивает все процессы, запущенные от имени пользователя postgres. Или:

pkill postgres

Это убивает все процессы, называемые «postgres».

Как не использовать kill -9( kill -KILL). Просто kill(без вариантов) делает то SIGTERM, что вы хотите.

Кроме того, вы можете проверить расположение pgdata, если вы можете подключиться к PostgreSQL. Например:

sudo -u postgres psql -c "SHOW data_directory";

... или проверяя его переменные окружения там , где вы идентифицируете администратора почты . Ищите тот, который является родителем других процессов. Например:/proc/[postmaster pid]/environps -fHC postgrespostgres

postgres   794     1  0 Nov06 ?        00:00:03 /usr/pgsql-9.3/bin/postgres -D /var/lib/pgsql/9.3/data -p 5432
postgres   857   794  0 Nov06 ?        00:00:00   postgres: logger process   
postgres   871   794  0 Nov06 ?        00:00:00   postgres: checkpointer process   
postgres   872   794  0 Nov06 ?        00:00:00   postgres: writer process   
postgres   873   794  0 Nov06 ?        00:00:00   postgres: wal writer process   
postgres   874   794  0 Nov06 ?        00:00:03   postgres: autovacuum launcher process   
postgres   875   794  0 Nov06 ?        00:00:07   postgres: stats collector process   

Его dadadir обычно отображается в командной строке.

Крейг Рингер
источник
3

Это заставляет меня нервничать, когда я вижу kill и postgres в одной команде. Чтобы ответить на вопрос, используя только pg_ctl, это было бы:

pg_ctl -D $(psql -Xtc 'show data_directory') stop

Аргумент -X говорит, что нужно игнорировать .psqlrcфайл. Это полезно, если у вас есть psql, настроенный на выдачу времени, затраченного на запрос (с помощью команды \ timer).

Аргумент -t говорит об удалении имени столбца в верхней части вывода и общего количества произведенных строк.

Аргумент -c содержит код SQL для выполнения.

Запуск голого psql -c 'show data_directory', вероятно, приведет к следующему выводу:

      data_directory
--------------------------
 /path/to/postgresql/data
(1 row)

Следовательно, обратная галочка через это $( ... )приведет /path/to/postgresql/dataк аргументу -D в pg_ctl, который затем упорядоченно остановит базу данных.

dland
источник
1
Я думаю, если это официально должно работать, это должен быть правильный ответ. Это новый вариант?
Мэтт
Это решение выиграет от объяснения используемых опций, а также от использования PGDATAпеременной среды. Моя попытка запустить эту команду привела к сбою, так как не было такой базы данных под моим именем пользователя Linux.
Стефан
show data_directoryможет быть запущен без указания базы данных, и на самом деле ни один из моих серверов не имеет базы данных на мое имя. И при этом это не требует PGDATA, таким образом, я затрудняюсь объяснить Ваш отказ.
dland