問題描述
當您不記得數據庫目錄是什麽,也沒有定義 PGDATA 環境變量時,如何使用 pg_ctl
(或其他方式)很好地停止所有 postgres 進程?
最佳辦法
可以安全地:
sudo pkill -u postgres
這會終止以用戶 postgres
身份運行的所有進程。或者:
pkill postgres
這會殺死所有名為 ‘postgres’ 的進程。
不要使用 kill -9
( kill -KILL
)。隻是 kill
(沒有選項)做一個 SIGTERM
,這就是你想要的。
或者,如果可以連接到 PostgreSQL,則可以檢查 pgdata 位置。例如:
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
它的數據目錄通常會顯示在它的命令行上。
次佳辦法
在同一個命令中看到 kill 和 postgres 讓我很緊張。要僅使用 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
傳遞給 pg_ctl 的 -D 參數,然後它將以有序的方式停止數據庫。