3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PostgreSQL 入門Advent Calendar 2023

Day 23

【PostgreSQL】シグナル送信について

Last updated at Posted at 2023-12-22

初めに

PostgreSQLのプロセスに対して、シグナルを送信することで特定の操作を行うことができます。以下に、PostgreSQLでよく使用されるシグナルをいくつかまとめていきます。

SIGHUP(ID:1)

このシグナルは、PostgreSQLプロセスに対して設定ファイルの再読み込みを要求します。このシグナルは、設定ファイル(postgresql.confpg_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では現在のクエリの終了やプロセスの終了に使用されます。
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?