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

데이터베이스 가용성에 따라 서비스가 하나만 있는 경우 @GracefulRestart의 답변이 가장 좋습니다. 그러나 이 요구 사항이 있는 서비스가 여러 개 있는 경우 모든 서비스가 의존할 수 있는 일회성 서비스를 만듭니다 Requires=.

/etc/systemd/system/[이메일 보호됨]

[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다음 ExecStartPre.ExecStart

관련 정보