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?
sumber
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?
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]/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
Datadirasinya umumnya akan ditampilkan di baris perintahnya.
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 .psqlrc
file. 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/data
argumen -D dari pg_ctl, yang kemudian akan menghentikan database secara tertib.
PGDATA
variabel lingkungan. Upaya saya menjalankan perintah ini mengakibatkan gagal karena tidak ada database seperti itu di bawah nama pengguna Linux saya.show data_directory
dapat 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.Ini bekerja untuk saya ref. https://stackoverflow.com/a/5408501/248616
sumber