Відповіді:
Це безпечно:
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]/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 зазвичай відображатиметься у його командному рядку.
Мене нервує бачити вбивство і постгреси в одній команді. Щоб відповісти на питання лише використовуючи 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, який потім зупинить базу даних в порядку.
PGDATA
змінної середовища. Моя спроба запустити цю команду призвела до помилки, оскільки такої бази даних під моїм іменем Linux не було.
show data_directory
можна запускати, не вказуючи базу даних, і справді жоден мій сервер не має бази даних на моє ім’я. Також це не вимагає PGDATA, тож я не в змозі пояснити ваш збій.
Ця робота для мене ref. https://stackoverflow.com/a/5408501/248616
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'YOUR_NAME';