PostgreSQLバージョン確認を自動化する|cronとシェルスクリプトで複数サーバーを一括管理

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > データーベース管理 > PostgreSQLバージョン確認を自動化する|cronとシェルスクリプトで複数サーバーを一括管理
「PostgreSQLのバージョンを調べたいのに、どのコマンドで確認すればいいか分からない」「複数台のDBサーバーがあって、全部のバージョンを一括で把握したい」——こういった声は、管理対象のサーバー台数が増えてきたLinux管理者からよく聞かれます。

バージョン確認は一見シンプルな作業ですが、確認方法が複数あり、パッケージバージョンとPostgreSQL自身が報告するバージョンが微妙に異なることもあります。また、複数サーバーを手作業で一台ずつ確認していると、バージョン違いやアップデート漏れを見落とすリスクが高まります。

この記事では、psqlコマンドによる基本的なバージョン確認から、シェルスクリプトとcronを使った複数サーバーの定期的な一括管理まで、RHEL 9.4 / Rocky Linux 9 / Ubuntu 24.04 LTSの実環境で動作確認した手順を解説します。

この記事のポイント

・psql --versionとSELECT version()でpostgresqlバージョン確認が即座にできる
・rpm -qとdpkg -lでパッケージレベルのバージョンも把握できる
・SSHループスクリプトで複数サーバーを一括取得してCSVに記録できる
・cronで定期実行しバージョン変化を自動検知してメール通知できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

PostgreSQLのバージョン確認が複数サーバーで問題になる理由

セキュリティパッチ適用状況の把握、EOL(サポート終了)の確認、レプリケーション構成でのバージョン一致確認——これらはどれも複数サーバーのバージョン管理と直結します。

特にストリーミングレプリケーション環境では、プライマリとスタンバイのメジャーバージョンが一致していないと、予期しない動作やフェイルオーバー失敗を引き起こします。また、PostgreSQL 12以前はすでにEOLを迎えており、サポートされていないバージョンを気づかずに本番運用しているケースも現場では少なくありません。

「確認するだけなら手作業で十分」という考え方は、サーバーが2~3台のうちは通用します。しかし5台、10台と増えてくると、手作業のバージョン確認は確実に抜け漏れが発生します。

psqlとpostgresコマンドによる基本的なバージョン確認

1. psql --versionでクライアントバージョンを確認する

最もシンプルな確認方法です。psqlコマンド自体のバージョン(クライアントのバージョン)を表示します。

$ psql --version psql (PostgreSQL) 15.6

この方法はサーバーへの接続なしで実行できるため、cronスクリプトのテストなど接続不要な場面でも使えます。ただし、クライアントのバージョンであり、実際に動作しているDBサーバーのバージョンとは異なる場合があります。

2. SELECT version()でサーバーバージョンを確認する

本番DBサーバーが動作しているバージョンを正確に確認するには、psqlでデータベースに接続してSQLを実行します。

# postgresユーザーに切り替えてからpsqlを起動する $ sudo -u postgres psql postgres=# SELECT version(); version ------------------------------------------------------------------------------------------------------------ PostgreSQL 15.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.4.1 20230605 (Red Hat 11.4.1-2), 64-bit (1 row)

コンパイル時のアーキテクチャや使用したgccバージョンも含めた詳細情報が取得できます。シェルスクリプトからワンライナーで実行する場合は次のように書きます。

$ sudo -u postgres psql -t -c "SELECT version();" | grep -oP 'PostgreSQL \S+' PostgreSQL 15.6

-tオプションで余分なヘッダとフッタを除去し、grepで「PostgreSQL バージョン番号」だけを取り出しています。

3. パッケージバージョンをrpm / dpkgで確認する

RHEL系(Rocky Linux / AlmaLinux)では、インストールされているパッケージのバージョンを確認できます。rpm コマンドの使い方を参考に、次のコマンドを実行してください。

# RHEL / Rocky Linux の場合(PGDGリポジトリ導入済み) $ rpm -q postgresql15-server postgresql15-server-15.6-1PGDG.rhel9.x86_64 # パッケージ名が分からない場合 $ rpm -qa | grep postgresql postgresql15-15.6-1PGDG.rhel9.x86_64 postgresql15-server-15.6-1PGDG.rhel9.x86_64 postgresql15-libs-15.6-1PGDG.rhel9.x86_64

Ubuntu / Debian系では dpkg コマンドで確認します。

# Ubuntu 24.04 LTS の場合 $ dpkg -l 'postgresql*' | awk '/^ii/{print $2, $3}' postgresql-15 15.6-1.pgdg24.04+1 postgresql-client-15 15.6-1.pgdg24.04+1 postgresql-common 258.pgdg24.04+1

シェルスクリプトで複数サーバーのバージョンを一括取得する

サーバーが複数台ある環境では、手作業による個別確認は限界があります。SSHのパスワードなし認証(公開鍵認証)が設定済みであれば、シェルスクリプトで一括取得できます。

1. SSHで複数ホストをループする基本スクリプト

#!/bin/bash # check-pg-version.sh — 複数DBサーバーのPostgreSQLバージョンを一括確認する DB_HOSTS=( db01.example.internal db02.example.internal db03.example.internal ) SSH_USER="ec2-user" for HOST in "${DB_HOSTS[@]}"; do PG_VER=$(ssh -o ConnectTimeout=5 -o BatchMode=yes "${SSH_USER}@${HOST}" \ "sudo -u postgres psql -t -c \"SELECT version();\" 2>/dev/null | grep -oP 'PostgreSQL \S+'" 2>/dev/null) if [ -z "${PG_VER}" ]; then echo "${HOST}: 取得失敗(接続不可またはPostgreSQLが停止中)" else echo "${HOST}: ${PG_VER}" fi done

実行例です。

$ bash check-pg-version.sh db01.example.internal: PostgreSQL 15.6 db02.example.internal: PostgreSQL 15.6 db03.example.internal: PostgreSQL 14.11

db03だけバージョンが異なることが一目で分かります。

2. バージョン情報をCSVに記録する

定期実行した結果を蓄積するために、CSVファイルへの書き出しを追加します。

#!/bin/bash # check-pg-version-csv.sh — バージョン情報をCSVに追記する DB_HOSTS=(db01.example.internal db02.example.internal db03.example.internal) SSH_USER="ec2-user" LOG_DIR="/var/log/pg-version" LOG_FILE="${LOG_DIR}/pg-version-$(date '+%Y%m').csv" TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') mkdir -p "${LOG_DIR}" for HOST in "${DB_HOSTS[@]}"; do PG_VER=$(ssh -o ConnectTimeout=5 -o BatchMode=yes "${SSH_USER}@${HOST}" \ "sudo -u postgres psql -t -c \"SELECT version();\" 2>/dev/null | grep -oP 'PostgreSQL \S+'" 2>/dev/null) PG_VER="${PG_VER:-UNREACHABLE}" echo "${TIMESTAMP},${HOST},${PG_VER}" >> "${LOG_FILE}" done

生成されるCSVの例です。

2026-09-27 02:00:01,db01.example.internal,PostgreSQL 15.6 2026-09-27 02:00:02,db02.example.internal,PostgreSQL 15.6 2026-09-27 02:00:03,db03.example.internal,PostgreSQL 14.11

cronで定期実行してバージョン変化を自動検知する

スクリプトを手動で実行するだけでは、バージョン変化の見落としが起きます。cronに登録して毎日自動実行し、変化があったときだけ通知する仕組みを作ります。複数サーバーの自動管理はLinux実務の基礎スキルであり、セミナーの実習でも必ず扱うテーマです。

1. crontabへの登録手順

# crontabを編集する(rootで登録する場合) $ sudo crontab -e # 毎日午前2時に実行(cron.logに標準出力・標準エラーを記録する) 0 2 * * * /usr/local/bin/check-pg-version-csv.sh >> /var/log/pg-version/cron.log 2>&1

スクリプトは事前に実行権限を付与しておきます。

$ sudo cp check-pg-version-csv.sh /usr/local/bin/ $ sudo chmod 755 /usr/local/bin/check-pg-version-csv.sh

2. 前回の記録と差分が出たらメール通知する仕組み

バージョンが変化したときだけ通知を飛ばす改良版スクリプトです。

#!/bin/bash # check-pg-version-notify.sh — バージョン変化を検知してメール通知する DB_HOSTS=(db01.example.internal db02.example.internal db03.example.internal) SSH_USER="ec2-user" LOG_DIR="/var/log/pg-version" PREV_FILE="${LOG_DIR}/pg-version-prev.txt" CURR_FILE="${LOG_DIR}/pg-version-curr.txt" NOTIFY_MAIL="admin@example.com" mkdir -p "${LOG_DIR}" : > "${CURR_FILE}" for HOST in "${DB_HOSTS[@]}"; do PG_VER=$(ssh -o ConnectTimeout=5 -o BatchMode=yes "${SSH_USER}@${HOST}" \ "sudo -u postgres psql -t -c \"SELECT version();\" 2>/dev/null | grep -oP 'PostgreSQL \S+'" 2>/dev/null) echo "${HOST}:${PG_VER:-UNREACHABLE}" >> "${CURR_FILE}" done if [ -f "${PREV_FILE}" ]; then DIFF=$(diff "${PREV_FILE}" "${CURR_FILE}") if [ -n "${DIFF}" ]; then echo "PostgreSQLバージョン変化を検知しました。 ${DIFF}" | mail -s "[要確認] PostgreSQL version change detected" "${NOTIFY_MAIL}" fi fi cp "${CURR_FILE}" "${PREV_FILE}"

このスクリプトをcronで毎日実行しておくと、バージョンが変わった日(アップデート実施後など)だけメールが届きます。変化がない日は何も送信されないため、通知疲れが起きません。

トラブルシュート|よくあるエラーと対処法

「sudo: a terminal is required to read the password」と表示される
SSHで sudo -u postgres を実行しようとしたときに対話パスワードが求められるケースです。サーバー側の /etc/sudoers に次の1行を追加して、パスワードなしで実行できるようにします(必ず visudo で編集してください)。

# /etc/sudoers への追記(visudoで編集すること) ec2-user ALL=(postgres) NOPASSWD: /usr/bin/psql

「psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed」と表示される
PostgreSQLサービスが停止中の場合に発生します。まずサービスの状態を確認してください。

$ sudo systemctl status postgresql-15 * postgresql-15.service - PostgreSQL 15 Database Server Loaded: loaded (/usr/lib/systemd/system/postgresql-15.service; enabled; vendor preset: disabled) Active: inactive (dead)

Active: inactive (dead) の場合はサービスを起動します。

$ sudo systemctl start postgresql-15 $ sudo systemctl status postgresql-15 | grep Active Active: active (running) since Sat 2026-09-27 02:10:05 JST; 3s ago

grep -oP が「invalid option」になる
macOSのgrepはPCRE(-Pオプション)非対応です。本記事の手順はLinux(GNU grep)向けです。macOSのPCからSSHで接続してLinuxサーバー上で実行する場合は問題ありません。

本記事のまとめ

やりたいこと コマンド・方法
クライアントのバージョン確認 psql --version
サーバーのバージョン確認(SQL) sudo -u postgres psql -t -c "SELECT version();"
パッケージバージョン確認(RHEL系) rpm -qa | grep postgresql
パッケージバージョン確認(Debian系) dpkg -l 'postgresql*'
複数サーバーの一括確認 SSHループスクリプト + CSV記録
バージョン変化の自動検知 cronで定期実行 + diff + mail通知
バージョン確認を「その都度手作業で調べる」運用から「定期的に自動集計・変化検知する」運用に切り替えることで、アップデート漏れやバージョン不一致による障害を事前に防げます。シェルスクリプトとcronによる自動化は、Linuxサーバー管理の基本スキルの一つです。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、DBサーバーの構築から運用自動化まで、実機ハンズオンで学べるLinux Master Pro Seminarがあります。20年以上・3,100名以上の指導実績を持つ現役エンジニアが、現場で使える「型」を直接教えます。>>詳細・お申し込みはこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。