Как можно аккуратно остановить все процессы postgres с помощью pg_ctl
(или без него), если вы не помните, какой каталог находится в базе данных, и не определена ли переменная среды PGDATA?
решение1
Безопасно:
sudo pkill -u postgres
Это убивает все процессы, запущенные от имени пользователя postgres
. Или:
pkill postgres
Это убивает все процессы с именем «postgres».
Делатьнетиспользуйте kill -9
( kill -KILL
). Просто kill
(без параметров) делает SIGTERM
, что вам и нужно.
В качестве альтернативы вы можете проверить местоположение pgdata, если вы можете подключиться к PostgreSQL. Например:
sudo -u postgres psql -c "SHOW data_directory";
...или проверив его переменные окружения в , где вы идентифицируете postmaster с помощью . Найдите тот, который является родителем других процессов. Например:/proc/[postmaster pid]/environ
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 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
Его datadir обычно отображается в командной строке.
решение2
Меня нервирует, когда я вижу kill и postgres в одной команде. Чтобы ответить на вопрос, используя только pg_ctl
, это будет:
pg_ctl -D $(psql -Xtc 'show data_directory') stop
Аргумент -X говорит игнорировать .psqlrc
файл. Это полезно, если у вас настроен psql для вывода времени, затраченного на запрос (через команду \timing).
Аргумент -t указывает на необходимость удаления имени столбца в верхней части вывода и общего количества созданных строк.
Аргумент -c содержит код SQL, который необходимо выполнить.
Запуск bare, psql -c 'show data_directory'
вероятно, даст следующий результат:
data_directory
--------------------------
/path/to/postgresql/data
(1 row)
Следовательно, обратный проход $( ... )
приведет /path/to/postgresql/data
к аргументу -D pg_ctl, который затем остановит базу данных в упорядоченном порядке.
решение3
Эта работа для меня реф.https://stackoverflow.com/a/5408501/248616
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'YOUR_NAME';
решение4
Вы можете просто выполнить команду
systemctl stop postgresql
Когда вы захотите перезапустить его, запустите
systemctl start postgresql
- Вероятно, эти команды потребуют от вас добавления
sudo