가능하다면 시스템 설치 및 업그레이드 내용을 편집하지 않고도 Systemd
부팅 시 restart() 또는 다시 로드(구성만 다시 로드)할 수 있는 방법이 있는지 알고 싶습니다 .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
답변1
PartOf
이 섹션을 사용할 수 있습니다 [Unit]
.
예:PartOf=B.service
매뉴얼 페이지에서,
부분 =
종속성 구성은 Requires=와 유사하지만 장치를 중지하고 다시 시작하는 것으로 제한됩니다. systemd가 여기에 나열된 장치를 중지하거나 다시 시작하면 작업이 해당 장치에 전파됩니다. 이는 단방향 종속성입니다. 이 장치를 변경해도 나열된 장치에는 영향을 미치지 않습니다.
답변2
stop
나는 with 를 제어할 수 없었고 PartOf=
, A
with 를 멈출 수도 없었습니다 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를 내부적으로(예: 다른 서비스 파일을 통해) 작동하는 경우에는 작동하지 않습니다.