Note: Massimo Dal Zotto氏による寄稿。
Postgres では、以下のシグナルを使用し て、postmaster とバックエンドの間の通信を行ないます。
Table 26-1. Postgres Signals
シグナル | postmaster の動作 | サーバの動作 |
---|---|---|
SIGHUP | kill(*,sighup) を実行します。 | read_pg_options() を実行します。 |
SIGINT | 終了します。 | 問い合わせを取り止めます。 |
SIGQUIT | kill(*,sigterm) を実行します。 | handle_warn() を実行します。 |
SIGTERM | kill(*,sigterm)、kill(*,9) を実行し、その後終了します。 | die() を実行します。 |
SIGPIPE | 無視します。 | die() を実行します。 (訳注: 6.5.3 の postgres.c では、SIG_IGN、つまり、無視しています。) |
SIGUSR1 | kill(*,sigusr1) を実行し、その後終了します。 | quickdie() を実行します。 |
SIGUSR2 | kill(*,sigusr2) を実行します。 | 非同期の通知を扱います。(SI キャッシュの書き出しも行ないます。) |
SIGCHLD | reaper()を実行します。 | 無視します。(試験のためまだコードには残っています。) (訳注: 6.5.3 の postgres.c ではSIG_IGN、つまり無視しています。) |
SIGTTIN | 無視します。 | |
SIGTTOU | 無視します。 | |
SIGCONT | dumpstatus を実行します。 (訳注: 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