як красиво зупинити всі постгресові процеси


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   

Її datadir зазвичай відображатиметься у його командному рядку.


3

Мене нервує бачити вбивство і постгреси в одній команді. Щоб відповісти на питання лише використовуючи 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, який потім зупинить базу даних в порядку.


1
Я думаю, якщо це офіційно призначено для роботи, це має бути правильною відповіддю. Це новий варіант?
мат

Це рішення отримало б користь від пояснення параметрів, які використовуються, а також використання PGDATAзмінної середовища. Моя спроба запустити цю команду призвела до помилки, оскільки такої бази даних під моїм іменем Linux не було.
Стефан

show data_directoryможна запускати, не вказуючи базу даних, і справді жоден мій сервер не має бази даних на моє ім’я. Також це не вимагає PGDATA, тож я не в змозі пояснити ваш збій.
длан

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.