다른 서비스가 시작되거나 다시로드되면 시스템 장치 서비스 다시 시작 가능) B.service. A.serviceB.service설치, 비활성화 또는 중지되지

가능한 경우 시스템에서 설치 및 업그레이드 한 편집없이 시작하거나 다시로드 할 때 Systemd다시 시작 A.service( After) 하는 방법이 있는지 알고 싶습니다 B.service(설정 다시로드 만 가능) B.service.

A.serviceB.service설치, 비활성화 또는 중지되지 않은 경우에도 시작해야합니다 .

A.service:

[Unit]
After = B.service network-online.target
Wants = B.service

[Service]
Type=oneshot
ExecStart = /script.sh start
ExecStop = /script.sh stop
RemainAfterExit=yes

[Install]
WantedBy = network-online.target

B.service:

[Unit]
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/cmd start
ExecStop=/cmd stop
ExecReload=/cmd reload
PIDFile=/var/run/cmd.pid

[Install]
WantedBy=multi-user.target


답변

섹션 PartOf에서 사용할 수 있습니다 [Unit].

예: PartOf=B.service

맨 페이지에서

PartOf =

Required =와 유사하지만 장치 중지 및 재시작으로 제한되는 종속성을 구성합니다. systemd가 여기에 나열된 장치를 중지하거나 다시 시작하면 작업이이 장치로 전파됩니다. 이는 단방향 종속성입니다.이 장치를 변경해도 나열된 장치에는 영향을 미치지 않습니다.


답변

내가 통제 할 없었 stopPartOf=,와 A함께 중지하지 않아야 B내가 사용 결국, 그래서 재정의 공급 업체 설정을 , 작동하는 것 같다.

/etc/systemd/system/B.service.d/override.conf

[Service]
ExecStart=
ExecStart=/bin/sh -c '/cmd start || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'
ExecReload=
ExecReload=/bin/sh -c '/cmd reload || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'

/cmd구현은 비동기식이며 액세스 /script.sh해야하는 리소스 에 액세스합니다. 현재 몇 초 동안 더 잘자는 것은 없습니다.

직접 사용 systemctl [--no-block] try-restart하기 전에 사용 하려고했지만 /script.sh작동하지 않았습니다.


답변

현재 systemd는이 시나리오를 다루지 않습니다. 서비스 파일만으로는이 기능을 수행 할 수 없습니다. 하나의 가능성은 동일한 이름의 쉘 스크립트를 통해 systemctl을 가로 채고 B.service가 다시 시작되거나 다시로드되는지 확인하고 A.service를 사용하여 적절한 조치를 수행하고 필요한 경우 업데이트하십시오. rc.local은 부팅시 적절한 상태를 유지합니다. docker.service 및 network.service 에이 문제가 있지만 항상 함께 다시 시작합니다.

systemctl restart docker.servicenetwork.service

시스템 자체가 B.service를 내부적으로 조작하는 경우 (예 : 다른 서비스 파일을 통해)이 방법은 효과적이지 않습니다.