systemd 서비스를 시작한 다음 재부팅 시 중지합니다.

systemd 서비스를 시작한 다음 재부팅 시 중지합니다.

기본적으로 systemd가 서비스를 다시 시작하라는 요청을 받으면 첫 번째 프로세스를 중지한 다음 두 번째 프로세스를 시작하므로 타임라인은 다음과 같습니다.

PROCESS A
--------[stopped]
                    [started]--------
                    PROCESS B

서비스 가동 중지 시간을 감당할 수는 없지만 두 서비스를 함께 시작하는 것은 괜찮으므로 타임라인을 다음과 같이 표시하고 싶습니다.

PROCESS A
------------------[stopped]
        [started]------------------
        PROCESS B

어떻게 해야 하나요?

답변1

해결 방법을 제안합니다. 서비스의 여러 인스턴스를 만들고 첫 번째 인스턴스를 중지하기 전에 두 번째 인스턴스를 시작합니다.

예를 들어 다음과 같은 이름의 유닛 파일을 구성합니다(필수)./etc/systemd/system/[email protected]@

[Install]
# for example
WantedBy=multi-user.target

[Unit]
# for example
Description=mymonitor %i

[Service]
# for example; the %i may not be useful in your case
ExecStart=/path/to/monitor %i

그것을 발견:

sudo systemctl daemon-reload

활성화:

sudo systemctl enable mymonitor@thisone

...그리고 시작 시 인스턴스 이름 "thisone"으로 모니터를 시작합니다.

이제 서비스를 다시 시작하려는 경우 스크립트를 사용하여 간단한 테스트를 수행할 수 있습니다.

#!/bin/sh
if systemctl is-active mymonitor@thisone > /dev/null
then
  systemctl start mymonitor@thatone &&
  systemctl stop mymonitor@thisone
else if systemctl is-active mymonitor@thatone
  systemctl start mymonitor@thisone &&
  systemctl stop mymonitor@thatone
else
  echo Houston, we have a problem
  # or perhaps you want to start, with: systemctl start mymonitor@thisone
fi

시작과 중지 사이에 더 많은 중복이 필요한 경우 다음을 사용하여 빌드하세요.

# ...
if systemctl start mymonitor@thisone
then
  sleep 7
  systemctl stop mymonitor@thatone
fi
# ...

답변2

로드 밸런서, 방화벽 규칙 또는 트래픽 재라우팅 없이 한 노드에서 이를 직접 달성하는 것은 불가능하다고 생각합니다. 확실히 systemd의 범위를 벗어납니다.

그 이유는 서비스가 수신 대기 포트를 차지하기 때문입니다. 다운타임을 없애기 위해 클라이언트는 존재하지 않는 포트나 서비스를 위해 다운된 포트로 연결되어서는 안 됩니다. 그러나 동일한 포트와 IP에서 동시에 Process A및 를 실행할 수는 없습니다 Process B.

가동 중지 시간을 없애려면 이전 포트가 아닌 다른 포트에서 새 프로세스를 시작한 다음 방화벽 규칙이나 로드 밸런서와 같은 기능을 사용하여 이전 포트에서 새 포트로 트래픽을 리디렉션해야 합니다. 그런 다음 이전 클라이언트의 연결이 끊어질 때까지 기다려야 합니다. 그런 다음에만 이전 서비스를 끌 수 있습니다.

이를 달성하는 "일반적인" 방법은 로드 밸런서 뒤에 두 개의 노드(두 개의 서버)를 사용하는 것입니다. 이 경우 다른 노드를 가리키도록 로드 밸런서를 임시로 재구성하여 노드를 다시 시작하고, 다시 시작이 완료된 후 다시 다시 구성할 수 있습니다.

이것은 systemd의 범위를 훨씬 넘어서는 것입니다. 방화벽을 사용하여 이 프로세스를 자동화하고 다른 포트를 사용하도록 서비스를 자동으로 재구성하려는 경우 이를 달성하기 위한 복잡한 스크립트 세트를 구축하고 reload이를 사용자 정의 옵션으로 연결할 수 있습니다.

관련 정보