Как вы можете красиво остановить все процессы postgres с помощью pg_ctl
(или иначе), когда вы не помните, что такое каталог базы данных, и не определена переменная среды PGDATA?
Это безопасно для:
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/[pid почтмейстера]/около
, где вы отождествляете почтмейстера с ps -fHC postgres
. Ищите тот, который является родителем другого. postgres
процессы. Например:
postgres 794 1 0 Nov06 ? 00:00:03 /usr/pgsql-9.3/bin/postgres -D /var/lib/pgsql/9.3/data -p 5432postgres 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
Его datadir обычно отображается в командной строке.
Это заставляет меня нервничать, видя kill и postgres в одной команде. Чтобы ответить на вопрос, используя только pg_ctl
, это было бы:
pg_ctl -D $(psql -Xtc 'show data_directory') stop
Аргумент -X говорит, что нужно игнорировать .psqlrc
файл. Это полезно, если у вас настроен psql для выдачи времени, затраченного на запрос (с помощью команды \timing).
Аргумент -t указывает на удаление имени столбца в верхней части выходных данных и общего количества созданных строк.
Аргумент -c содержит SQL-код, который должен быть выполнен.
Бегущий голый psql -c 'show data_directory'
вероятно, это приведет к следующему результату:
data_directory-------------------------- /path/to/postgresql/data(1 row)
Следовательно, возвращая это через $( ... )
доставит /path/to/postgresql/data
к аргументу -D pg_ctl, который затем упорядоченно остановит базу данных.
Эта работа для мерефа. https://stackoverflow.com/a/5408501/248616
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'YOUR_NAME';