web-dev-qa-db-ja.com

すべてのpostgresプロセスをうまく停止する方法

データベースディレクトリが何であるかを思い出せず、PGDATA環境変数が定義されていない場合、どのようにしてpg_ctl(またはそれ以外)ですべてのpostgresプロセスをうまく停止しますか?

32
matt

安全です:

Sudo pkill -u postgres

(ユーザーpostgresとして実行されているすべてのprocを強制終了します)または

pkill postgres

(「postgres」という名前のすべてのプロシージャを強制終了します)

notkill -9kill -KILL)を使用します。 killはオプションなしでSIGTERMを実行します。

または、Pgに接続できる場合は、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   

通常、datadirはコマンドラインに表示されます。

56
Craig Ringer

同じコマンドでkillとpostgresを見ると緊張します。 pg_ctlのみを使用して質問に答える場合、次のようになります。

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

-X引数は、.psqlrcファイルを無視するように指示します。これは、(\ timingコマンドを介して)クエリにかかる時間を出力するようにpsqlを構成している場合に便利です。

-t引数は、出力の上部にある列名と生成された行の総数を削除するように指示します。

-c引数には、実行されるSQLコードが含まれます。

裸のpsql -c 'show data_directory'を実行すると、おそらく次の出力が生成されます。

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

したがって、$( ... )を介してこれをバックティックすると、/path/to/postgresql/dataがpg_ctlの-D引数に配信され、その後、データベースが正常に停止されます。

3
dland