cara menghentikan semua proses postgres dengan baik

33

Bagaimana Anda menghentikan semua proses postgres dengan baik pg_ctl(atau sebaliknya), ketika Anda tidak ingat apa itu direktori basis data, atau variabel lingkungan PGDATA tidak didefinisikan?

matt
sumber

Jawaban:

58

Aman untuk:

sudo pkill -u postgres

Itu membunuh semua proses yang berjalan sebagai pengguna postgres. Atau:

pkill postgres

Itu membunuh semua proses yang disebut 'postgres'.

Jangan tidak menggunakan kill -9( kill -KILL). Just kill(tanpa opsi) melakukan SIGTERM, yang adalah apa yang Anda inginkan.

Atau, Anda dapat memeriksa lokasi pgdata jika Anda dapat terhubung ke PostgreSQL. Sebagai contoh:

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

... atau dengan memeriksa variabel lingkungannya di , tempat Anda mengidentifikasi kepala kantor pos . Cari yang merupakan induk dari proses lainnya . Sebagai contoh:/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   

Datadirasinya umumnya akan ditampilkan di baris perintahnya.

Craig Ringer
sumber
3

Itu membuat saya gugup melihat membunuh dan postgres dalam perintah yang sama. Untuk menjawab pertanyaan hanya menggunakan pg_ctl, itu akan menjadi:

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

Argumen -X mengatakan untuk mengabaikan .psqlrcfile. Ini berguna jika Anda memiliki psql yang dikonfigurasi untuk memancarkan waktu yang diambil oleh kueri (melalui perintah \ timing).

Argumen -t mengatakan untuk menghapus nama kolom di bagian atas output dan jumlah baris yang diproduksi.

Argumen -c berisi kode SQL yang akan dieksekusi.

Menjalankan bare psql -c 'show data_directory'mungkin akan menghasilkan output berikut:

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

Oleh karena itu, melakukan backticking melalui ini $( ... )akan menghasilkan /path/to/postgresql/dataargumen -D dari pg_ctl, yang kemudian akan menghentikan database secara tertib.

dland
sumber
1
Saya kira, jika ini secara resmi dimaksudkan untuk bekerja, ini harus menjadi jawaban yang benar. Apakah ini opsi baru?
matt
Solusi ini akan mendapat manfaat dari menjelaskan opsi yang digunakan, serta penggunaan PGDATAvariabel lingkungan. Upaya saya menjalankan perintah ini mengakibatkan gagal karena tidak ada database seperti itu di bawah nama pengguna Linux saya.
Stephane
show data_directorydapat dijalankan tanpa menentukan database, dan memang tidak ada server saya yang memiliki database atas nama saya. Juga tidak memerlukan PGDATA, jadi saya bingung menjelaskan kegagalan Anda.
dland