systemdを使用してリモートデータベースが利用可能であることを確認する方法

systemdを使用してリモートデータベースが利用可能であることを確認する方法

SysVでは、データベースが起動して実行される前にアプリケーションが起動しないようにする条件を使用できます。初期化スクリプトに少しの待ち時間を与え、データベースサービスがまだ利用できない場合は、しばらくして最終的に放棄します。

start() {
local exec=/path/to/exec
local tries=1
[ -x $exec ] || exit 5
echo -n $"Starting $prog: "


#check communication to database
if ! [ 2>/dev/null : < /dev/tcp/$dbHost/$dbPort ]
    then
        while ! [ 2>/dev/null : < /dev/tcp/$dbHost/$dbPort ] && [ ! $tries -ge 5 ]
            do
                >&2 echo -e "Could not connect to the database on $dbHost\nWaiting 10 seconds to check database status, attempt $tries"
                sleep 10
                ((tries++))
        done
        sleep 10
        if ! (: < /dev/tcp/$dbHost/$dbPort ) 2>/dev/null
            then
                >&2 echo -e "Could not connect to the database on $dbHost aborting startup of $exec"
                exit 1
        fi
fi

同様のシナリオを見つけるためにドキュメントとGoogleを検索しましたが、ローカルサービスを参照していないものが見つかりませんでした。

答え1

データベースの可用性に応じてサービスが1つしかない場合は、@GracefulRestartの答えが最適です。ただし、この要件を持つ複数のサービスがある場合は、すべてのサービスが依存できるワンタイムサービスを作成しますRequires=

/etc/systemd/system/[Eメール保護]

[Unit]
Description=Checks database availability on %I
After=network.target
Requires=network.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/path/to/portopen.sh %I

[Install]
WantedBy=default.target

/パス/to/portopen.sh

#!/bin/bash
dbhost=${1:-localhost}
dbport=${2:-5678}
maxtries=${3:-5}
wait=${4:-10}
tries=1

# Check communication to database
while ! [ 2>/dev/null : < /dev/tcp/$dbhost/$dbport ]; do
   echo "Unable to connect to database on $dbhost TCP/$dbport (attempt $tries): retrying in $wait seconds" >&2
   (( tries++ ))
   if [[ $tries -le $maxtries ]]; then
      sleep $wait
   else
      echo "Unable to connect to database on $dbhost TCP/$dbport: aborting"
      exit 1
   fi
done

データベースサーバーを変更または追加したり、ポートを変更したり、サービスレベルごとの再試行回数を変更したりする場合に備えて、スクリプトをより柔軟にしました。必要でない場合は、サービス部門に電話して部品をportopen.service取り外してください。%I

データベースサーバーが開いていfoobarて、そのサーバーでデータベースアプリケーションが実行されているとしますfoobarapp.service。次のように変更してくださいfoobarapp.service

# systemctl edit foobarapp.service

【エディタで】

[Unit]
[email protected]
[email protected]

その後、再ロードしsystemdてアクティブな確認を開始します。

# systemctl daemon-reload
# systemctl enable [email protected]

これによりfoobarapp.service、いつでも再起動できます。[email protected]成功した戻りが発生した場合にのみ開始する必要があります。

まだ存在しない場合、データベースアプリケーションサービスはfoobarapp.service次のようになります。

/etc/systemd/system/foobarapp.service

[Unit]
Description=Foobar database application
# Add any other dependencies here
[email protected]
[email protected]

[Service]
# If it is a daemon, use "forking" instead
Type=simple
ExecStart=/path/to/exec

[Install]
WantedBy=default.target

答え2

ExecStartPreを見ましたか?システムサービス文書?

exit 0データベーステストをスクリプトに入れ、成功と失敗に使用しexit 1ますExecStartPreExecStart

関連情報