다른 서비스가 시작되거나 다시로드되면 시스템 장치 서비스 다시 시작


16

가능한 경우 시스템에서 설치 및 업그레이드 한 편집없이 시작하거나 다시로드 할 때 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

답변:


12

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

예: PartOf=B.service

맨 페이지에서

PartOf =

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


감사합니다, 나는에보고 있었다 Overriding vendor settings그러나이 외모보다 더 쉽고 약속 만 excpetion 내가 원하지 않는 것입니다 A경우 중지 B그냥 정지를 A.restart하는 경우 B.start다음, 어쨌든 곧 몇 가지 테스트를 할 것이다 그것을 관리 할 수있는 몇 가지 방법이 있는지 알 수 있습니다
Alex

@ 알렉스 : 당신은 무엇을 사용하는 경우 PartOfRestart=always함께?
Thushi

나는 Restart=문서를보고 있는데, oneshot서비스 의 동작이 무엇인지 잘 모르겠지만 다음과 관계없이 : When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restartedB를 올바르게 수동으로 중지하면 A가 중지됩니다.
Alex

자, 이제 현상금은 만료를 위해 자동으로 할당되었습니다. @Thushi 나는 당신의 노력과 제안에 감사하지만 PartOf질문에 대한 해결책은 아니지만 어쨌든 즐기십시오.
Alex

@ 알렉스 : 글쎄, 포인트는 나에게 중요하지 않습니다. 포인트를 적립 할 수있는 다른 방법이 많이 있습니다. 제공된 솔루션으로 문제를 해결할 수 있는지 알고 싶습니다. 그렇지 않다면, 우리는 더 연구 할 것입니다. PartOf함께 사용 하는 것은 Restart=always어떻습니까? 당신은 그것을 시도 했습니까?
Thushi

3

내가 통제 할 없었 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작동하지 않았습니다.


이 시나리오에 대한 솔루션을 찾고 있습니다. 이 솔루션을 좀 더 설명해 주시겠습니까? 또는 수행 한 내용을 읽고 이해하기 위해 일부 문서에 대한 링크를 제공하십시오.
zappy

@zappy 님, 설명서를 찾 man systemd.unit거나 설치되어 있지 않은 경우 온라인으로 검색하여 "공급 업체 설정 재정의"장을 찾으십시오.
Alex

입력 해 주셔서 감사합니다. 서비스 B는 공급 업체마다 다르며 해당 서비스 파일을 편집하고 싶지 않기 때문에 위의 방법 만 선택한다는 것을 알고 있습니다. 그러나 필자의 경우 서비스 A와 B는 모두 공급 업체가 제공하지 않습니다. 재정의하면 시스템이 복잡해질 수 있습니다. 다른 옵션이 있습니까?
zappy

문제는 몇 살인데 문서를 확인 했습니까? 이 시나리오는 이후에 다루어 졌을 것입니다. 나는 서둘러 있었지만 시간이지나면서 체계적인 공식 메일 링 리스트를 찾아서 물어 보게 되면서 결국 문제가 생겼습니다.
Alex

1

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

systemctl restart docker.servicenetwork.service

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.