다른 서비스가 시작되거나 다시 로드되면 Systemd Unit 서비스가 다시 시작됩니다.

다른 서비스가 시작되거나 다시 로드되면 Systemd Unit 서비스가 다시 시작됩니다.

가능하다면 시스템 설치 및 업그레이드 내용을 편집하지 않고도 Systemd부팅 시 restart() 또는 다시 로드(구성만 다시 로드)할 수 있는 방법이 있는지 알고 싶습니다 .A.serviceAfterB.serviceB.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

답변1

PartOf이 섹션을 사용할 수 있습니다 [Unit].

예:PartOf=B.service

매뉴얼 페이지에서,

부분 =

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

답변2

stop나는 with 를 제어할 수 없었고 PartOf=, Awith 를 멈출 수도 없었습니다 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구현은 비동기식이며 리소스에 액세스하려면 access 도 필요하며 /script.sh(아직) 몇 초 동안 잠을 자는 더 좋은 방법을 찾지 못했습니다.

systemctl [--no-block] try-restart직접 사용하기 전에 사용해봤는데 /script.sh성공하지 못했습니다.

답변3

현재 systemd에서는 이 상황을 다루지 않습니다. 이 기능은 서비스 파일만으로는 불가능합니다. 한 가지 가능성은 동일한 이름을 가진 쉘 스크립트를 통해 systemctl을 하이재킹하고 그 안에서 B.service가 다시 시작/시작되거나 다시 로드될지 확인하고 A.service에서 적절한 작업을 수행하고 필요한 경우 rc.local을 업데이트하는 것입니다. 올바른 상태는 다음과 같습니다. 시작 시에도 달성되었습니다. docker.service 및 network.service에 이 문제가 있지만 항상 함께 다시 시작합니다.

systemctl 재시작 docker.servicenetworking.service

분명히 systemd 자체가 B.service를 내부적으로(예: 다른 서비스 파일을 통해) 작동하는 경우에는 작동하지 않습니다.

관련 정보