Câu trả lời:
An toàn để:
sudo pkill -u postgres
Điều đó giết chết tất cả các quá trình chạy như người dùng postgres
. Hoặc là:
pkill postgres
Điều đó giết chết tất cả các quy trình có tên là 'postgres'.
Đừng không sử dụng kill -9
( kill -KILL
). Chỉ cần kill
(không có tùy chọn) làm một SIGTERM
, đó là những gì bạn muốn.
Ngoài ra, bạn có thể kiểm tra vị trí pgdata nếu bạn có thể kết nối với PostgreSQL. Ví dụ:
sudo -u postgres psql -c "SHOW data_directory";
... hoặc bằng cách kiểm tra các biến môi trường của nó , nơi bạn xác định người quản lý bưu điện . Tìm kiếm cái mà cha mẹ của các quá trình khác . Ví dụ:/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 của nó thường sẽ được hiển thị trên dòng lệnh của nó.
Nó làm cho tôi lo lắng khi thấy kill và postgres trong cùng một lệnh. Để trả lời câu hỏi chỉ sử dụng pg_ctl
, đó sẽ là:
pg_ctl -D $(psql -Xtc 'show data_directory') stop
Đối số -X nói bỏ qua .psqlrc
tệp. Điều này rất hữu ích nếu bạn đã cấu hình psql để phát ra thời gian thực hiện bởi một truy vấn (thông qua lệnh \ time).
Đối số -t nói để xóa tên cột ở đầu ra và tổng số hàng được tạo.
Đối số -c chứa mã SQL được thực thi.
Chạy trần psql -c 'show data_directory'
có thể sẽ tạo ra đầu ra sau:
data_directory
--------------------------
/path/to/postgresql/data
(1 row)
Do đó, việc sao lưu thông qua $( ... )
này sẽ phân phối /path/to/postgresql/data
đến đối số -D của pg_ctl, sau đó sẽ dừng cơ sở dữ liệu một cách có trật tự.
PGDATA
biến môi trường. Nỗ lực của tôi trong việc chạy lệnh này đã dẫn đến thất bại vì không có cơ sở dữ liệu như vậy dưới tên người dùng Linux của tôi.
show data_directory
có thể được chạy mà không chỉ định cơ sở dữ liệu và thực sự không có máy chủ nào của tôi có cơ sở dữ liệu trong tên của tôi. Nó cũng không yêu cầu PGDATA, vì vậy tôi không thể giải thích được sự thất bại của bạn.
Công việc này cho tôi ref. https://stackoverflow.com/a/5408501/248616
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'YOUR_NAME';