가능한 경우 시스템에서 설치 및 업그레이드 한 편집없이 시작하거나 다시로드 할 때 Systemd
다시 시작 A.service
( After
) 하는 방법이 있는지 알고 싶습니다 B.service
(설정 다시로드 만 가능) B.service
.
A.service
B.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가 여기에 나열된 장치를 중지하거나 다시 시작하면 작업이이 장치로 전파됩니다. 이는 단방향 종속성입니다.이 장치를 변경해도 나열된 장치에는 영향을 미치지 않습니다.
답변
내가 통제 할 없었 stop
와 PartOf=
,와 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를 내부적으로 조작하는 경우 (예 : 다른 서비스 파일을 통해)이 방법은 효과적이지 않습니다.