Chapter 26. Postgres のシグナル

Note: Massimo Dal Zotto氏による寄稿。

Postgres では、以下のシグナルを使用し て、postmaster とバックエンドの間の通信を行ないます。

Table 26-1. Postgres Signals

シグナルpostmaster の動作サーバの動作
SIGHUPkill(*,sighup) を実行します。 read_pg_options() を実行します。
SIGINT終了します。問い合わせを取り止めます。
SIGQUITkill(*,sigterm) を実行します。handle_warn() を実行します。
SIGTERMkill(*,sigterm)、kill(*,9) を実行し、その後終了します。die() を実行します。
SIGPIPE無視します。die() を実行します。 (訳注: 6.5.3 の postgres.c では、SIG_IGN、つまり、無視しています。)
SIGUSR1kill(*,sigusr1) を実行し、その後終了します。quickdie() を実行します。
SIGUSR2kill(*,sigusr2) を実行します。非同期の通知を扱います。(SI キャッシュの書き出しも行ないます。)
SIGCHLDreaper()を実行します。無視します。(試験のためまだコードには残っています。) (訳注: 6.5.3 の postgres.c ではSIG_IGN、つまり無視しています。)
SIGTTIN無視します。 
SIGTTOU無視します。 
SIGCONTdumpstatus を実行します。 (訳注: 6.5.3 の postmaster.c では SIGWINCH に dumpstatus ハンドラを割 り当てています。 SIGCONT は SIG_DFL ハンドラのままでした。例えば、Solaris2.6 では無視さ れることになります。 
SIGFPE FloatExceptionHandler() を実行します。

Note: "kill(*,signal)" は、全てのバックエンドに引数 signal を送 ることを意味します。

シグナルの取り扱いに関する旧版との大きな違いは、警告を取り扱うため に SIGHUP ではなく SIGQUIT を使用するようにしたこと、pg_options フ ァイルを再読み込みするために SIGHUP を使用するようにしたこと、そし て、postmaster に送られた SIGHUP、SIGTERM、SIGUSR1、SIGUSR2 シグナ ルを全ての有効なバックエンドに再送するようにしたことです。この方法 によって、postmaster に送られたシグナルは、プロセス番号を調査するこ となく、全バックエンドに自動的に送られるようになりました。postgres を停止するためにすることは、postmaster に SIGTERM を送るだけです。こ れにより全てのバックエンドは自動的に停止します。

SIGUSR2 シグナルは、バックエンドが長期間 SI キャッシュを処理しない時 に発生する可能性がある、SI キャッシュテーブルのオーバーフローを防ぐた めにも使われます。あるバックエンドが SI テーブルの使用状況が 70% に達 したことを検出すると、バックエンドは postmaster にシグナルを送ります。 シグナルを受け取った postmaster は、待ち状態になっている全てのバックエ ンドを活性化し、キャッシュを書き出します。

以下のものは、よくプログラマが行なうシグナルの使用方法です。

# postgres を停止する。
kill -TERM $postmaster_pid
# 全てのバックエンドを停止する。
kill -QUIT $postmaster_pid
# postmaster のみを停止する。
kill -INT $postmaster_pid
# pg_options を変更する。
cat new_pg_options > $DATA_DIR/pg_options
kill -HUP $postmaster_pid
# バックエンド用の pg_options のみを変更する。
cat new_pg_options > $DATA_DIR/pg_options
kill -HUP $backend_pid
cat old_pg_options > $DATA_DIR/pg_options