Shellの基礎知識(実践編)

【RHEL系Linux】PostgreSQLを自動インストールするシェルスクリプトの使い方

ジョンとの共存など、多くの作業工程で人為的ミスが発生しがちです。本記事では、PostgreSQLのインストール・削除・確認を1本のシェルスクリプトで自動化する方法を解説します。

特定バージョンの導入から、複数バージョンの共存管理、不要なバージョンのアンインストールまでをスムーズに行える仕組みとなっており、現場の手作業を極力排除した再現性の高い構成になっています。

運用自動化ツール

🟡 運用自動化ツール
📌 面倒な作業を一括効率化!シェルスクリプトで実現する運用自動化術
├─ 基本共通
| ├─【Shellの基礎知識】簡単なログ出力ロジックを作ってみました。
| ├─【Shellの基礎知識】シェルスクリプトの作成を時短!テンプレートで効率化する方法
| ├─【Shellの基礎知識】共通関数定義クラスの完全ガイド!設計から実践まで徹底解説
├─ 開発環境構築
| ├─【RHEL系Linux】開発サーバー初期設定スクリプトの完全自動化
| ├─【RHEL系Linux】Apache+Let's Encrypt 自動構築スクリプト|バーチャルホスト対応
| ├─【RHEL系Linux】Tomcatを自動インストール・設定するスクリプトの作成と活用法
| └─【RHEL系Linux】PostgreSQLを自動インストールするシェルスクリプトの使い方
└─ 運用・保守
  ├─【RHEL系Linux】任意サービスを簡単制御!汎用サービススクリプトの活用術
  ├─【RHEL系Linux】ファイルやログを自動圧縮する汎用スクリプトの実装と活用法
  ├─【RHEL系Linux】リソース(CPU・MEM)監視スクリプトで使用率・異常を検知する仕組み
  ├─【RHEL系Linux】中間ファイル連携を完全制御するファイル転送スクリプト
  ├─【RHEL系Linux】信頼性を重視した完了保証型ディレクトリ転送スクリプトの設計と実装
  ├─【RHEL系Linux】ディスク使用率を自動監視するシェルスクリプトの実装
  └─【RHEL系Linux】サーバーの障害検知と自動通知|systemdログ監視の実装例

概要と目的

PostgreSQLを複数バージョンで運用している現場では、バージョンごとのポート設定や、重複インストールの防止、削除時の依存関係など、煩雑な作業が日常的に発生します。

手動対応ではヒューマンエラーが避けられず、構成の一貫性が損なわれるケースもあります。

本記事では、こうした問題を解決するために開発したシェルスクリプトの概要と、その運用上の目的について解説します。

PostgreSQLの複数バージョン管理の課題

複数バージョンのPostgreSQLを同一ホスト上で扱う場合、以下のような問題が発生しやすくなります。

  • どのバージョンがどのポートで動作しているかを把握しづらい
  • 誤って同一ポートに重複インストールしてしまう
  • 不要なバージョンの削除が手間で後回しになりがち

このような状況が継続すると、セキュリティパッチの適用漏れや構成管理の煩雑化など、システム全体の安定性に悪影響を及ぼします。

スクリプト導入による運用改善の効果

本スクリプトを導入することで、以下のような具体的な改善効果が得られます。

  • 導入済みのPostgreSQLバージョンとポート一覧を自動取得
  • 競合ポートを事前に検出してインストールをブロック
  • 指定バージョンの安全なアンインストール処理

これにより、バージョン管理の一貫性を維持しつつ、操作ミスを未然に防ぎ、属人化した作業を排除できます

スクリプト設計と仕様

このスクリプトは、PostgreSQLのバージョンごとのインストールや削除、そして既存環境の一覧取得を効率的に行うために設計されています。現場での複数バージョン共存や、ポート競合の問題などを解決する目的で構築されたもので、再利用性とメンテナンス性を重視しています。

前提となる実行環境

Beエンジニアでシェルスクリプトを実行する環境は下記の通りとします。

実行環境

BASE_DIR(任意のディレクトリ)

  • scripts
    • bin(実行スクリプト格納領域)
      • <<各種実行スクリプト>>.sh (実行ファイル)
    • com(共通スクリプト格納領域)
      • logger.shrc(共通ログ出力ファイル)
      • utils.shrc(共通関数定義ファイル)
    • etc(設定ファイル等の格納領域)
      • infraMessage.conf(メッセージ定義ファイル)
    • log(スクリプト実行ログの格納領域)
      • スクリプト名.log 
    • tmp(テンポラリ領域)
    • rep(レポート出力領域)

PostgreSQL自動構成スクリプト

PostgreSQL自動構成スクリプトは、複数バージョンのPostgreSQLを環境に合わせて導入・削除・一覧表示することができる汎用的なツールです。ポート競合の検出や、バージョン別のディレクトリ配置、自動的なサービス登録など、開発環境での運用に必要な基本機能をすべて備えています。クラスタ構成のような複雑な環境には対応していませんが、スタンドアロンでの開発用途には十分な機能を提供します。スクリプトは冪等性を重視して設計されており、安全かつ再現性のある導入作業が可能です。

注意(重要)
本スクリプトは RHEL/AlmaLinux 8 および 9 環境での動作を前提に検証しています。
AlmaLinux 10(RHEL 10 系)では、PostgreSQL 公式 PGDG リポジトリの EL10 向け提供状況によっては、インストールやバージョン共存機能が正常に動作しない場合があります。
AlmaLinux 10 上での実行は動作保証外とし、利用時は自己責任でお願いします。

#!/bin/sh
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#
# install_postgres.sh
# 
# Description:
#    PostgreSQL バージョン共存対応の導入/一覧/削除ツール
#    - RHEL8/9 対応
#    - PGDG リポジトリ自動登録(10〜16)
#    - logger.shrc / utils.shrc に準拠
#
# PATCH v1.6b (2025‑08‑04)
#   * dnf-plugins-core 事前導入
#   * makecache / install / initdb に進捗ログ
#   * ソケット競合確認強化
#   * **重複していた os_major 取得行を 1 行に統一** ← NEW
# ------------------------------------------------------------------
# <変更履歴>
# Ver. 変更管理No. 日付        更新者       変更内容
# 1.0  -           2025/08/04  Bepro       新規作成
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
# ------------------------------------------------------------------
# 初期処理
# ------------------------------------------------------------------
. "$(dirname "$0")/../com/logger.shrc"
. "$(dirname "$0")/../com/utils.shrc"
setLANG     utf-8
runAs root "$@"

# ------------------------------------------------------------------
# 変数宣言
# ------------------------------------------------------------------
scope="var"

# ------------------------------------------------------------------
# PostgreSQL初期パスワード設定(※任意のパスワードを設定してください)
# この変数はインストール直後のpostgresユーザーのログイン用パスワードです。
# セキュリティ上の理由から、ダウンロード後に必ず自分で設定してください。
# ------------------------------------------------------------------
POSTGRES_PASS="P@ssW0rd"  # ← ここを任意の安全なパスワードに書き換えてください

readonly JOB_OK=0
readonly JOB_WR=1
readonly JOB_ER=2
rc=${JOB_ER}

MODE=""
VERSION=""
PORT=""

# ------------------------------------------------------------------
# 関数定義
# ------------------------------------------------------------------
scope="func"

usage() {
    cat << EOF
Usage:
  sh install_postgres.sh -m < install | erase | list > [-v <version>] [-p <port>]

Options:
  -m    処理モード(install, erase, list)※必須
  -v    PostgreSQLのメジャーバージョン番号(例: 15, 16)
  -p    使用するポート番号(デフォルト: 5432)
EOF
    exit ${JOB_ER}
}

terminate() {
    releaseLock
}

checkArgs() {

    case "$MODE" in
        list) : ;;
        install|erase) [ -z "$VERSION" ] && usage ;;
        *) usage ;;
    esac

    [ -z "$PORT" ] && PORT=5432

    if echo "$PORT" | grep -qE "[^0-9]"; then
        logOut "ERROR" "ポート番号は数値で指定してください。"
        exitLog ${JOB_ER}
    fi

    if [ -n "$VERSION" ] && [ "$MODE" != "list" ] && [ "$VERSION" -lt 14 ]; then
        logOut "ERROR" "PostgreSQL ${VERSION} 系はサポート対象外です (14 以上を指定)"
        exitLog ${JOB_ER}
    fi
}

# ------------------------------------------------------------------
# 関数名  :getRepoUrl
# 概要   :PostgreSQLのリポジトリURLを取得する
# 説明   :
#   指定されたバージョンとRHELのバージョンに応じて、対応する
#   yumリポジトリのrpmパッケージURLを返却する。
# 
# 引数   :$1 = PostgreSQLバージョン
# 戻り値  :標準出力でリポジトリURLを返す
# 使用箇所 :installPostgres
# ------------------------------------------------------------------
getRepoUrl() {
  local rhel_ver
  rhel_ver=$(rpm -E %rhel)
  echo "https://download.postgresql.org/pub/repos/yum/reporpms/EL-${rhel_ver}-x86_64/pgdg-redhat-repo-latest.noarch.rpm"
}

# ------------------------------------------------------------------
# 関数名  :installPgRepo
# 概要   :PostgreSQL用リポジトリを確認・追加
# 説明   :
#   指定バージョンの PostgreSQL リポジトリが未登録であれば、
#   公式リポジトリを取得して自動で登録します。
#   既に有効であればスキップされます。
#
# 引数   :なし(グローバル変数 VERSION を参照)
# 戻り値  :正常時 0、失敗時は exitLog で強制終了
# 使用箇所 :installPostgres()
# ------------------------------------------------------------------
installPgRepo() {
    logOut "INFO" "PostgreSQL ${VERSION} のPGDGリポジトリを登録します。"

    case "$VERSION" in
        10|11|12|13|14|15|16) ;;
        *) logOut "ERROR" "PostgreSQL ${VERSION} 系はサポート対象外です"; exitLog ${JOB_ER};;
    esac

    # 既存設定削除(外部URL依存のrepoを排除)
    rm -f /etc/yum.repos.d/pgdg*.repo
    dnf -y remove pgdg-redhat-repo >/dev/null 2>&1 || true

    # RHELメジャー取得
    local rhel_ver
    rhel_ver=$(rpm -E %rhel)

    # GPGキーをローカル固定(失敗時は gpgcheck=0 にフォールバック)
    local gpg_file="/etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL"
    local gpg_line=""
    mkdir -p /etc/pki/rpm-gpg

    if curl -fsSL -o "${gpg_file}" "https://apt.postgresql.org/pub/repos/yum/keys/PGDG-RPM-GPG-KEY-RHEL"; then
        rpm --import "${gpg_file}" || { logOut "WARNING" "GPG鍵のimportに失敗。gpgcheck=0へ切替"; gpg_line="gpgcheck=0"; }
        [ -z "${gpg_line}" ] && gpg_line="gpgcheck=1
gpgkey=file://${gpg_file}"
    else
        logOut "WARNING" "GPG鍵の取得に失敗。gpgcheck=0へ切替します。"
        gpg_line="gpgcheck=0"
    fi

    # 外部鍵URLを一切使わない .repo を手動生成
    local repo_file="/etc/yum.repos.d/pgdg${VERSION}.repo"
    cat > "${repo_file}" <<EOF
[pgdg${VERSION}]
name=PostgreSQL ${VERSION} for RHEL/CentOS ${rhel_ver} - x86_64
baseurl=https://download.postgresql.org/pub/repos/yum/${VERSION}/redhat/rhel-${rhel_ver}-x86_64
enabled=1
${gpg_line}
EOF

    # EL-9未満のみAppStreamのpostgresqlを無効化
    if [ "${rhel_ver}" -lt 10 ]; then
        dnf -qy module disable postgresql || true
    fi

    dnf clean all
    dnf makecache --disablerepo='*' --enablerepo="pgdg${VERSION}" -y

    if ! dnf list --available --disablerepo='*' --enablerepo="pgdg${VERSION}" "postgresql${VERSION}-server" >/dev/null 2>&1; then
        logOut "ERROR" "postgresql${VERSION}-server が見えません(repo設定を確認)"
        exitLog ${JOB_ER}
    fi

    logOut "INFO" "PGDGリポジトリ登録OK(gpgkeyはローカル固定/外部鍵URL非依存)。"
}

# ------------------------------------------------------------------
# 関数名  :checkPortConflict
# 概要   :PostgreSQLポート競合の事前検出
# 説明   :
#   PostgreSQLインストール前に、指定ポートが既存インスタンスや
#   設定ファイルと競合していないかを確認する。
#   以下2点の競合パターンを検出:
#     - postgresql.conf ファイル内で既に使用されている
#     - 現在 LISTEN 中のプロセス(postgres)で使用中
#
# 引数   :なし(グローバル変数 PORT を使用)
# 戻り値  :競合がなければ0、競合があれば exitLog で異常終了
# 使用箇所 :installPostgres 関数内のインストール前検査
# ------------------------------------------------------------------
checkPortConflict() {
    conf_files=$(find /var/lib/pgsql -type f -name "postgresql.conf" 2>/dev/null)
    for conf in $conf_files; do
        used_port=$(grep -E "^port\s*=" "$conf" | awk -F= '{gsub(/[[:space:]]/, "", $2); print $2}')
        [ -z "$used_port" ] && used_port="5432"
        if [ "$used_port" = "$PORT" ]; then
            logOut "ERROR" "指定ポート${PORT}は他バージョンの設定ファイルと競合しています($conf)"
            exitLog ${JOB_ER}
        fi
    done

    if ss -ltnp 2>/dev/null | grep -q ":${PORT} .*postgres"; then
        logOut "ERROR" "指定ポート${PORT}は既に PostgreSQL プロセスが LISTEN しています。"
        exitLog ${JOB_ER}
    fi
}

# ------------------------------------------------------------------
# 関数名  :installPostgres
# 概要   :PostgreSQLの指定バージョン・ポートへの自動インストール処理
# 説明   :
#   指定された PostgreSQL のバージョンとポートに対して、
#   pgdg レポジトリ追加、dnf によるパッケージインストール、initdb、
#   postgresql.conf のポート書き換え、systemd 起動、初期パスワード設定までを自動化。
#   主な処理内容:
#     - 同一バージョンの既インストールを検出してブロック
#     - 指定ポートの競合チェック(checkPortConflict)
#     - pgdg リポジトリの有効化とキャッシュ更新
#     - PostgreSQL 本体のインストールと initdb
#     - 設定ファイルのポート書き換えと systemctl 起動
#     - postgresユーザーの初期パスワード設定
#
# 引数   :なし(グローバル変数 VERSION, PORT を使用)
# 戻り値  :正常終了なら rc=${JOB_OK}、エラー時は exitLog で強制終了
# 使用箇所 :mainプロセス(install 指定時)
# ------------------------------------------------------------------
installPostgres() {
    checkPortConflict

    # ------------------------------------------------------------------
    # PostgreSQL同一バージョンのインストールチェック
    # ------------------------------------------------------------------
    if rpm -q "postgresql${VERSION}-server" >/dev/null 2>&1; then

    logOut "WARNING" "PostgreSQL ${VERSION} は既にインストールされています。同一バージョンの再インストールは許可されていません。"
    exitLog ${JOB_ER}
fi

    if ! dnf list --quiet --disablerepo='*' --enablerepo="pgdg*" postgresql${VERSION}-server >/dev/null 2>&1; then
        installPgRepo
        logOut "INFO" "dnf makecache を実行してキャッシュを更新します。"
        dnf makecache --disablerepo='*' --enablerepo="pgdg*" -y
    fi

    logOut "INFO" "(2/3) postgresql${VERSION}-server をダウンロード / インストール中…"
    if ! dnf -y install --disablerepo='*' --enablerepo="pgdg*" "postgresql${VERSION}-server"; then
        logOut "ERROR" "指定バージョンのパッケージが取得できません: postgresql${VERSION}-server"
        exitLog ${JOB_ER}
    fi

    logOut "INFO" "(3/3) initdb を実行中…"
    /usr/pgsql-${VERSION}/bin/postgresql-${VERSION}-setup initdb || exitLog ${JOB_ER}
    conf_path="/var/lib/pgsql/${VERSION}/data/postgresql.conf"
    sed -i "s/^#\?port = .*/port = ${PORT}/" "$conf_path"

    if ss -ltnp 2>/dev/null | grep -q ":${PORT} .*postgres"; then
        logOut "ERROR" "initdb 後にポート${PORT}が既に使用されています。処理を中止します。"
        exitLog ${JOB_ER}
    fi

    systemctl enable postgresql-${VERSION}
    systemctl start  postgresql-${VERSION}

    logOut "INFO" "初期ユーザーパスワードを設定します。"
    query="ALTER USER postgres WITH PASSWORD '${POSTGRES_PASS}';"
    eval "su - postgres -c \"psql -p ${PORT} -c \\\"${query}\\\"\"" || exitLog ${JOB_ER}

    logOut "INFO" "PostgreSQL ${VERSION} をポート ${PORT} でインストール完了"
    rc=${JOB_OK}
}

# ------------------------------------------------------------------
# 関数名  :erasePostgres
# 概要   :PostgreSQLの指定バージョンをアンインストールする
# 説明   :
#   systemd に登録されている指定バージョンの PostgreSQL を停止・無効化し、
#   dnf 経由で該当バージョンのすべてのパッケージを削除。
#   さらに PostgreSQL データディレクトリも削除する。
#   処理対象は /var/lib/pgsql/${VERSION}。
#   ※指定バージョンが未インストールであれば即時エラー終了。
#
# 引数   :なし(グローバル変数 VERSION を使用)
# 戻り値  :正常終了なら rc=${JOB_OK}、エラー時は exitLog により終了
# 使用箇所 :mainプロセス(-m erase 指定時)
# ------------------------------------------------------------------
erasePostgres() {
    service="postgresql-${VERSION}"
    if ! systemctl list-unit-files | grep -q "${service}\.service"; then
        logOut "ERROR" "PostgreSQL ${VERSION} は導入されていません。"
        exitLog ${JOB_ER}
    fi
    systemctl stop "$service"
    systemctl disable "$service"
    dnf -y remove "postgresql${VERSION}-*" || true
    rm -rf "/var/lib/pgsql/${VERSION}"
    logOut "INFO" "PostgreSQL ${VERSION} を削除しました。"
    rc=${JOB_OK}
}

# ------------------------------------------------------------------
# 関数名  :listPostgres
# 概要   :インストール済みPostgreSQLインスタンスの一覧表示
# 説明   :
#   /var/lib/pgsql 以下を探索し、各バージョンの postgresql.conf を検出。
#   検出された設定ファイルごとに以下の情報を抽出して一覧表示する:
#     - バージョン(パス構造から抽出)
#     - ポート番号(設定ファイル内の port ディレクティブ)
#   port が未設定の場合はデフォルトの 5432 とみなす。
#   設定ファイルが1つも見つからなかった場合は未導入と判断。
#
# 引数   :なし
# 戻り値  :rc=${JOB_OK}
# 使用箇所 :mainプロセス(-m list 指定時)
# ------------------------------------------------------------------
listPostgres() {
    confs=$(find /var/lib/pgsql -type f -name "postgresql.conf" 2>/dev/null)
    if [ -z "$confs" ]; then
        logOut "INFO" "PostgreSQLは導入されていません。"
        rc=${JOB_OK}
        return
    fi
    echo "--- Installed PostgreSQL Instances ---"
    for conf in $confs; do
        ver=$(echo "$conf" | awk -F/ '{print $(NF-2)}')
        port=$(grep -E '^port[[:space:]]*=' "$conf" | awk -F= '{gsub(/[[:space:]]/, "", $2); print $2}')
        [ -z "$port" ] && port="5432"
        echo "Version: $ver => Port: $port"
    done
    rc=${JOB_OK}
}

# ------------------------------------------------------------------
# pre-process
# ------------------------------------------------------------------
scope="pre"

startLog
trap "terminate" 0 1 2 3 15

while getopts "m:v:p:" opt; do
    case "$opt" in
        m) MODE="$OPTARG" ;;
        v) VERSION="$OPTARG" ;;
        p) PORT="$OPTARG" ;;
        *) usage ;;
    esac
done

checkArgs "$@"

if acquireLock; then
    logOut "INFO" "Lock acquired."
else
    abort "Lock acquisition failed."
fi

# ------------------------------------------------------------------
# main-process
# ------------------------------------------------------------------
scope="main"

case "$MODE" in
    install) installPostgres ;;
    erase)   erasePostgres   ;;
    list)    listPostgres    ;;
    *) usage ;;
esac

# ------------------------------------------------------------------
# post-process
# ------------------------------------------------------------------
scope="post"

exitLog $rc

パスワードはソースコード内の変数 POSTGRES_PASS に設定してください。環境やセキュリティポリシーに応じて、必要に応じて変更してください。

ディレクトリ構成と依存ファイル

スクリプトは特定のディレクトリ構成を前提とし、共通関数やログ出力処理を読み込むことで一貫した動作を確保しています。

ディレクトリ役割
scripts/bin実行スクリプト本体(install_postgres.shなど)を配置
scripts/com共通関数ファイル(utils.shrc, logger.shrc)を配置
scripts/tmpロックファイルなど一時ファイルの格納場所

依存ファイルとして以下を必ず配置しておく必要があります。

  • logger.shrc:ログ出力を制御
  • utils.shrc:共通関数(runAs, getOsなど)を提供

処理モードと引数仕様

このスクリプトは処理モードを引数で指定し、動作内容を切り替える方式を採用しています。

モード説明
install指定されたバージョンのPostgreSQLを導入
erase指定されたバージョンのPostgreSQLを削除
list導入済みバージョンとポートの一覧を表示

引数の指定例は以下のとおりです。

sh install_postgres.sh -m install -v 14 -p 5433

オプション必須説明
-m必須実行モード(install, erase, list)
-vinstall, erase時に必須PostgreSQLのバージョン(例:14)
-pinstall時に任意使用するポート番号(未指定時は5432)

グローバル変数とログ出力方式

スクリプト内ではジョブステータスや一貫性を保つためのグローバル変数を定義し、ログ出力はlogger.shrcに準拠しています。
主なグローバル変数の定義は以下の通りです。

変数名用途
JOB_OK正常終了時の戻り値(0)
JOB_ER異常終了時の戻り値(1)
LOCK_FILE同時実行防止用ロックファイル

ログ出力は以下の形式で統一されており、ログレベル、処理ステージ、メッセージが記録されます。

logOut "INFO" "PostgreSQL 14 のインストールを開始します"
logOut "ERROR" "指定ポート5432はすでに使用されています"

このように、ログ出力は自作loggerに集約されており、トレース性とデバッグ性を確保しています。

今回は開発環境における個別のデータベース利用を想定しているため、同一バージョンのPostgreSQLを複数クラスタとして並列にインストールするような構成には対応しておりません。

処理ロジックの詳細

このセクションでは、PostgreSQLインストールスクリプトにおける各モードの処理ロジックについて詳しく説明します。 installeraselist の各モードはそれぞれ異なる目的で動作し、環境や指定パラメータに応じて適切に切り替わる仕組みになっています。

installモードの処理フロー

installモードでは、指定されたバージョンのPostgreSQLをインストールし、ポート番号の競合チェックや初期設定を自動で行います。バージョンやポート指定がない場合のデフォルト値にも対応しています。

sh install_postgres.sh -m install -v 14 -p 5433

指定バージョンのPostgreSQLリポジトリ追加とパッケージ導入

導入モードの処理

  • 同一ポート利用中のインスタンスチェック

  • 初期化・設定ファイルの配置

  • systemdへの登録およびサービス起動

  • postgresユーザーの初期パスワード設定

eraseモードの処理フロー

eraseモードでは、指定バージョンのPostgreSQLをシステムから削除します。バージョンを指定しない場合は処理エラーとなるため、必ず明示的にバージョンを与える必要があります。

sh install_postgres.sh -m erase -v 14

処理の主な内容は以下のとおりです。

削除モードの処理

  • 該当バージョンのサービス停止とsystemd登録解除

  • インストールされたバイナリと設定ファイルの削除

  • データディレクトリのバックアップおよび削除

  • 競合ポートの再確認(使用中であれば削除を中止)

listモードの処理フロー

listモードは、現在導入済みのPostgreSQLバージョンと、それぞれが使用しているポート番号を一覧表示する機能です。導入されていない場合は適切なメッセージを出力します。

sh install_postgres.sh -m list

処理内容は以下の通りです。

一覧モードの処理

  • /var/lib/pgsql 以下に存在する postgresql.conf を再帰的に検索

  • 設定ファイルからポート番号とバージョンを抽出

  • インストールバージョンとポートを表形式で出力

ポート競合の検出ロジック

PostgreSQLは同一ポートで複数インスタンスを起動することができないため、ポート競合のチェックは必須です。本スクリプトでは install および erase モードの両方でこのチェックが実施されます。

競合チェックの具体的なロジックは以下のとおりです。

競合検出ロジック

  • /var/lib/pgsql 以下の postgresql.conf を検索

  • 該当ファイル内の port = 行を抽出し、数値を取得

  • 要求ポートと一致した場合は競合と判定

  • 該当するバージョン・設定ファイル名と共にエラーメッセージを出力

grep -E "^port\s*=" "$conf" | awk -F= '{gsub(/[[:space:]]/, "", $2); print $2}'

この処理により、異なるバージョンであってもポートが重複している場合には即座にエラーを返し、安全性を確保しています。

実行例と活用パターン

このセクションでは、PostgreSQLのインストール・削除・一覧表示といった基本操作に加え、複数バージョンの共存に関する注意点について、具体的なコマンド例を用いて解説します。すべての操作は、専用スクリプトを用いて簡潔に実行できます。

PostgreSQLをインストールする例

PostgreSQLを指定バージョン・任意ポートでインストールするには、下記のように実行します。

sh install_postgres.sh -m install -v 14 -p 5433

バージョン14を5433ポートでインストールする例です。ポート番号の指定がない場合はデフォルトで5432が使用されます。既存のバージョンとポートが競合していないかはスクリプト内で自動的に検出されます。

特定バージョンを削除する例

インストール済みの特定バージョンを削除するには、以下のようにバージョンを指定します。

sh install_postgres.sh -m erase -v 14

必ず-vオプションで削除対象のバージョンを明示してください。削除時にも、競合チェックロジックが走り、安全な削除が実施されます。

導入済みバージョンを一覧表示する例

現在導入されているPostgreSQLのバージョンと使用ポートを一覧表示するには、次のように実行します。

sh install_postgres.sh -m list

出力例:

--- Installed PostgreSQL Instances ---
Version: 15 => Port: 5432
Version: 16 => Port: 5434
Version: 14 => Port: 5433

このコマンドにより、スクリプトが/var/lib/pgsql/配下を探索し、見つかったすべてのインスタンスに対して設定ファイルを読み取り、ポート番号とバージョンの情報を表示します。

複数バージョン共存時の注意点

PostgreSQLは複数バージョンを同一ホスト上に共存させることが可能ですが、ポート競合とパス競合に注意が必要です。スクリプトでは下記のようなロジックで事前検出を行っています。

  • 全バージョンの設定ファイル`postgresql.conf`を探索
  • 各設定ファイルから`port`値を抽出し、重複をチェック
  • 競合が見つかった場合はエラーを出力し、処理を中断

そのため、複数バージョンを導入する際は、必ず-pオプションで異なるポート番号を明示的に指定してください。

よく読まれている記事

1

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか? 無料で使えるだけでなく、高い柔軟 ...

2

Linux環境でよく目にする「Vim」という名前。サーバーにログインしたら突然Vimが開いてしまい、「どうやって入力するの?」「保存や終了ができない!」と困った経験をした人も多いのではないでしょうか。 ...

3

ネットワーク技術は現代のITインフラにおいて不可欠な要素となっています。しかし、ネットワークを深く理解するためには、その基本となる「プロトコル」と「レイヤ」の概念をしっかり把握することが重要です。 こ ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

5

Javaは世界中で広く使われているプログラミング言語であり、特に業務システムやWebアプリケーションの開発において欠かせない存在です。本記事では、初心者向けにJavaの基礎知識を網羅し、環境構築から基 ...

-Shellの基礎知識(実践編)