初めに
PostgreSQLのプロセスに対して、シグナルを送信することで特定の操作を行うことができます。以下に、PostgreSQLでよく使用されるシグナルをいくつかまとめていきます。
SIGHUP(ID:1)
このシグナルは、PostgreSQLプロセスに対して設定ファイルの再読み込みを要求します。このシグナルは、設定ファイル(postgresql.conf
やpg_hba.conf
)を更新した後に、その変更を反映させるために使用されます。
pg_ctl reload
または
SELECT pg_reload_conf();
SIGINT(ID:2)
このシグナルは、一部のPostgreSQLプロセスに対して特定の操作を中断するように要求します。
Ctrl+Cなどでシグナルを送れる。
例えば、pg_dump
コマンドの実行を中断するためにSIGINTを使用することができます。
kill -INT [プロセスID]
SIGKILL(ID:9)
プロセスに対して即時終了を要求します。このシグナルは、プロセスによって捕捉や無視、ブロックすることができないため、プロセスは必ず終了します。
ただし、SIGKILLは強制的にプロセスを終了させるため、データの破損や予期しない副作用を引き起こす可能性があります。そのため、このシグナルは最終手段としてのみ使用されるべきです。
PostgreSQLにおいては、通常、SIGKILLをPostgreSQLのプロセスに対して送信することは推奨されません。これは、データベースの整合性を保つために、PostgreSQLのプロセスが行う重要な終了処理をスキップする可能性があるからです。
もし、PostgreSQLのプロセスを終了させる必要がある場合は、まずはpg_terminate_backend()関数を使用するか、SIGTERMシグナルを送信して、プロセスが適切に終了処理を行う機会を与えるべきです。
特定のプロセスに対してSIGKILLを送信するには、以下のようにkillコマンドを使用します。
kill -9 [プロセスID]
-9
はSIGKILLのIDである9を指定してSIGKILLを送る
SIGSEGV(ID:11)
プロセスが不正なメモリアクセスを試みたときにシステムから送信されます。これは通常、プロセスのバグやシステムの問題を示し、プロセスはこのシグナルを受け取ると強制的に終了します。
SIGSEGV
は"Segmentation Violation"の略で、セグメンテーション違反(メモリの保護された領域への不正なアクセス)を示します。これは通常、ポインタの誤った使用や配列の範囲外アクセスなどによって引き起こされます。
PostgreSQLにおいては、SIGSEGV
が発生した場合、通常はバックエンドプロセスが強制的に終了し、クラッシュダンプが生成されます。それは通常、システムのバグや、ハードウェアの問題を示します。
SIGSEGV
はプロセス自体が生成するものではなく、システムがプロセスに対して送信するため、SIGSEGV
を手動で送信することは通常ありません。
SIGTERM(ID:15)
プロセスに対して終了を要求します。このシグナルは、プロセスが自身の終了処理(開放すべきリソースの解放など)を行った後に終了することを可能にします。
PostgreSQLでは、SIGTERM
はバックエンドプロセスに対して現在のクエリを終了し、そのプロセスを終了するために使用されます。PostgreSQLのバックエンドプロセスは、SIGTERM
を受け取ると現在のクエリを中断し、必要な終了処理を行った後に終了します。
また、PostgreSQLの主プロセス(postmaster)に対してSIGTERM
を送信すると、主プロセスは全ての子プロセス(バックエンドプロセス)に対してSIGTERM
を送信し、その後自身も終了します。これは、PostgreSQLをシャットダウンです。
SIGTERM
を送信するには、以下のようにkill
コマンドを使用します。
kill -TERM [プロセスID]
PostgreSQLのバックエンドプロセスを終了させるためには、通常、pg_terminate_backend()
関数を使用することが推奨されます。
以下は指定したユーザー名の全てのバックエンドプロセスを終了させるSQLです。実行するにはスーバーユーザー権限が必要です。
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE usename = 'ユーザー名';
まとめ
-
SIGHUP
は設定ファイルの再読み込みを要求します。 -
SIGINT
は特定の操作の中断を要求します。 -
SIGKILL
はプロセスの即時終了を要求しますが、使用は最終手段に限られます。 -
SIGSEGV
は不正なメモリアクセスがあった時にシステムから送信され、強制的にプロセスを終了します。 -
SIGTERM
はプロセスの終了を要求し、PostgreSQLでは現在のクエリの終了やプロセスの終了に使用されます。