시스템 서비스가 다른 서비스의 상태를 "추종"하게 만드는 방법은 무엇입니까?

시스템 서비스가 다른 서비스의 상태를 "추종"하게 만드는 방법은 무엇입니까?

systemd-networkd를 사용하여 "가상" 네트워크 인터페이스를 설정했습니다. 기본적으로 인터페이스는 "다운" 상태로 유지됩니다.

해당 인터페이스의 주소에 바인딩하는 애플리케이션을 실행하는 서비스 단위가 있습니다(인터페이스가 다운된 경우에도 바인딩할 수 있도록 비로컬 바인딩 사용). 서비스가 실행 중인 경우에만 네트워크 인터페이스가 "작동" 상태여야 합니다.

내가 원하는 결과는 서비스가 다시 시작되거나 충돌하여 복구할 수 없는 경우 인터페이스가 "다운" 상태로 유지되고 시스템의 라우팅 데몬(OSPF를 사용하는 Bird2)이 해당 주소에 대한 경로 광고를 중지하는 것입니다. 서비스는 사용 가능한 다른 인스턴스로 라우팅됩니다.

및를 사용하여 "ip link set up/down" 또는 "networkctl up/down" 명령을 실행할 수 있지만 ExecStartPost( ExecStopPost사실 이것이 첫 번째 시도입니다) 서비스의 단위 파일은 매우 엄격한 샌드박스 환경에서 실행됩니다. 사용자이므로 이러한 명령은 CAP_NET_ADMIN이 없는 환경에서 실행되므로 실행할 수 없습니다. 서비스 단위 파일의 예는 다음과 같습니다.여기.

또한 이러한 명령을 실행하기 위해 별도의 서비스를 생성해 보았습니다. 이 서비스는 "루트"로 잘 실행되고 이런 방식으로 제한되지 않습니다. 그러나 두 번째 서비스에 대한 종속성 사양이 발생하는 조합을 찾지 못했습니다.따르다첫 번째 서비스 상태입니다.

서비스 B에서 After=BindsTo=서비스 A를 가리키는 경우 시스템 시작 중에 서비스 A 후에 서비스 B가 올바르게 시작됩니다. 서비스 A가 중지되면 서비스 B도 중지됩니다. systemd가 서비스 A를 다시 시작하면 서비스 B도 다시 시작됩니다.

그러나 A 서비스가 중지되었다가 다시 시작되면 서비스 B는아니요여기요.

내가 생각할 수 있는 유일한 다른 옵션은 두 서비스를 결합하는 새 대상을 생성하고 서비스 A를 수동으로 시작할 수 없도록 제한하는 것입니다. 이런 방식으로 관리자에게 서비스가 아닌 대상을 시작해야 함을 경고합니다. . 하지만 이 새로운 대상을 자동으로 종속되게 만드는 방법은 명확하지 않습니다 multi-user.target.

답변1

좋아, 다른 답변의 비트를 사용하여 이것이 내가 끝낸 것입니다.

시스템 버전 248 이하의 경우

anycast-dns.target(애니캐스트 DNS 대상):

[Unit]
Description=Manage anycast DNS resolver and its network link

[Install]
WantedBy=multi-user.target

dns-링크-manager.service:

[Unit]
BindsTo=pdns-recursor.service
After=pdns-recursor.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/networkctl up dns
ExecStop=/usr/bin/networkctl down dns

[Install]
WantedBy=anycast-dns.target

pdns-recursor.service.d/anycast-dns.conf:

[Unit]
RefuseManualStart=yes

[Install]
WantedBy=
RequiredBy=anycast-dns.target

systemctl enable그들 각각을 위해 달려라.

이로써 원하는 결과를 얻었습니다.

  • 시작 시 anycast-dns.target은 pdns-recursor.service를 시작합니다. 성공하면 dns-link-manager.service가 네트워크 링크를 엽니다.

  • pdns-recursor.service가 중지되면(수동으로 또는 충돌하여 다시 시작할 수 없음) dns-link-manager.service가 네트워크 링크를 끊습니다.

  • 관리자는 pdns-recursor.service를 수동으로 시작(또는 다시 시작)할 수 없으며, 네트워크 링크도 작동하는지 확인하기 위해 anycast-dns.target을 프록시로 시작해야 합니다.

시스템 버전 249 이상

dns-링크-manager.service:

[Unit]
Requisite=pdns-recursor.service
After=pdns-recursor.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/networkctl up dns
ExecStop=/usr/bin/networkctl down dns

pdns-recursor.service.d/anycast-dns.conf:

[Unit]
Upholds=dns-link-manager.service
PropagatesStopTo=dns-link-manager.service

이로써 원하는 결과를 얻었습니다.

  • 시작 시 multi-user.target은 pdns-recursor.service를 시작합니다. 성공하면 dns-link-manager.service가 네트워크 링크를 엽니다(종속성으로 인해 Upholds).

  • pdns-recursor.service가 중지된 경우(수동으로 또는 충돌하여 다시 시작할 수 없음), dns-link-manager.service는 네트워크 링크를 끊습니다(종속성으로 인해 PropagatesStopTo).

  • pdns-recursor.service가 실행 중이 아니면 관리자는 dns-link-manager.service를 수동으로 시작할 수 없습니다(이 경우 dns-link-manager.service는 이미 실행 중임).

관련 정보