HOWTO · PostgreSQL
macOS で PostgreSQL サーバーが実行されているかどうかを確認する
この記事では、PostgreSQL のステータスを確認するためのいくつかの BASH コマンドについて説明します。
このページの内容
PostgreSQL がクライアントからの接続を受け付ける状態か確認するには、まず pg_isready を使います。プロセスの確認だけで分かるのは、プロセスが存在することまでです。以下では macOS のシェルコマンドを扱います。PostgreSQL のパッケージによってインストール構成が異なるため、コマンドの場所やクラスタのパスは、ディストリビューションや環境によって変わります。
macOS で PostgreSQL のプロセスと接続準備状況を確認する
確認したい内容に合わせてコマンドを選びます。pg_isready は PostgreSQL サーバーが接続要求に応答するかを調べます。データディレクトリが分かっている特定のクラスタを確認するには、pg_ctl status を使います。ps によるプロセスの確認はサーバープロセスを探すのに役立ちますが、クライアントが接続できることまでは確認できません。これらの情報は関係していますが、同じことを示すわけではありません。
以下はコマンドの使用例であり、ローカルのデータベースで取得した出力ではありません。PostgreSQL のインストール状況、サーバー、認証情報、パスは環境によって異なるため、ホスト、ポート、ユーザー、データディレクトリを自分の環境に合わせてください。
pg_isready で接続準備状況を確認する
既定の接続先を確認するには pg_isready を実行します。特定のホストとポートを調べる場合は、-h localhost や -p 5432 などのオプションを指定します。終了ステータスはスクリプトでの判定に使えます。
0: サーバーが接続を受け付けています。1: 起動中などの理由で、サーバーが接続を拒否しています。2: 応答がありませんでした。3: パラメーターが無効な場合など、接続が試行されませんでした。
PostgreSQL の pg_isready ドキュメントでは、これらの終了ステータスと接続オプションについて説明しています。
成功を示すステータスは、指定した接続先でサーバーが接続要求を受け付けていることを意味します。特定のデータベース、ロール、パスワード、スキーマ、クエリが利用できるかは確認しません。そのため、包括的なヘルスチェックではなく、接続準備状況を示す情報として扱ってください。
次のような短いシェル分岐で、成功を示すステータスを処理できます。この例では変数に値を直接設定しているため、データベースには接続しません。
このセクションのコードと表示されるラベルや出力は英語のままです。
status=0
case "$status" in
0) printf '%s\n' 'accepting connections' ;;
esac
accepting connections
実際に確認する場合は、pg_isready の実行直後に終了ステータスを保存し、その値に基づいて分岐してください。後続のコマンドによって、シェルが直近に保持する終了ステータスが置き換わることがあります。
pg_ctl status で既知のデータディレクトリを確認する
PGDATA にクラスタのデータディレクトリが設定されている場合は、pg_ctl -D "$PGDATA" status を使います。たとえば pg_ctl -D /path/to/cluster status のように、ディレクトリを明示することもできます。データディレクトリを環境から特定できない場合、pg_ctl には正しいディレクトリを指定する必要があります。postgres 実行ファイルのパスは、クラスタのデータディレクトリではありません。
PostgreSQL の pg_ctl ドキュメントでは、ここで使う status と start の操作、および -D と -l のオプションについて説明しています。
この確認では、指定したデータディレクトリに対応する postmaster プロセスが実行中かどうかが分かります。プロセスが実行中でも、PostgreSQL がクライアントからの接続を受け付けているとは限りません。その確認には pg_isready を使ってください。シェルの起動ファイルで PGDATA を設定している場合は、利用する前に、その値が初期化済みのクラスタディレクトリを指していることを確認してください。
ps で PostgreSQL のプロセスを調べる
プロセスを調べるには、ps aux | grep '[p]ostgres' を使います。利用できる環境では pgrep -fl postgres も使えます。角括弧を使ったパターンにすると、grep 自身のコマンドラインが検索結果に一致するのを防げます。プロセス名や引数からサーバーの起動方法や -D ディレクトリを特定できる場合がありますが、一致するプロセスはあくまで補助的な情報です。起動中、終了中、または接続を受け付けられない状態の可能性があります。
psql で分かるのは別の内容です。たとえば psql -h localhost -p 5432 -U myuser -d mydb -c 'SELECT 1' は、認証を伴う接続とクエリを試みます。失敗の原因は認証情報、データベースの選択、ネットワーク設定、サーバーの稼働状況などが考えられるため、プロセスだけを確認する方法ではありません。
接続エラーとデータディレクトリのエラーを調べる
「Connection refused」は、その時点で要求した接続先が接続を受け付けなかったことを示します。まずホストとポートが意図した値か確認し、pg_isready の結果と照らし合わせて、該当するサーバーログも調べてください。このメッセージだけでは、マシン上の PostgreSQL インスタンスがすべて停止しているとは判断できません。サービスが別のアドレスやポートで待ち受けている場合があります。
pg_ctl が postmaster.pid の欠落や使用不能を知らせる場合、データディレクトリのパス違い、権限、またはクラスタが停止していることが原因として考えられます。クラスタの初期化時に使ったディレクトリと、PGDATA の値を確認してください。which postgres の出力を -D に指定してはいけません。これは実行ファイルの場所を示すものであり、-D が必要とするのはクラスタのデータディレクトリです。どのクラスタが PID ファイルを所有しているか、またそのサーバーが停止しているかを確認するまでは、PID ファイルを削除しないでください。
PostgreSQL が停止している場合に pg_ctl で起動する
対象のクラスタが停止していて、データディレクトリを特定できている場合は、pg_ctl -D "$PGDATA" -l "$PGDATA/server.log" start で起動します。PGDATA が設定されていない場合は、正しいディレクトリに置き換えてください。-D はクラスタのディレクトリを指定し、-l はログファイルを指定します。コマンドを実行するアカウントが、クラスタとログの保存先にアクセスできることを確認してください。パッケージ管理下のインストールでは、専用の管理ツールからサービスを起動する必要がある場合もあります。
起動後、目的のホストとポートを指定して pg_isready を実行し、接続準備状況を確認します。既知のデータディレクトリの状態を確認したい場合は、pg_ctl ... status を使います。つまり、プロセスを探すにはプロセス確認、既知のクラスタを確認するには pg_ctl status、クライアントが接続できるか調べるには pg_isready を使います。