Type=notify
서비스 B가 시작되기 전에 초기화해야 하는 서비스 A가 있습니다 . 서비스 A가 다운되면 서비스 B도 이를 따라야 합니다. 문제는 A 서비스의 명칭이 명확하게 정의되어 있지 않다는 점이다. 이것은 [email protected]
.
여기는 내 서비스 유닛 B입니다
[Unit]
Description=start and shutdown with Service A
[email protected]
[email protected]
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/myprogram --start
ExecStop=/usr/bin/myprogam --stop
서비스 호출의 예는 다음과 같습니다.
sudo systemctl start [email protected]
하지만 myarg
실제로는 무엇이든 될 수 있으므로 서비스 B에서 서비스 A의 핸들을 얻는 방법이 혼란스럽습니다.
편집: 이것이 의도된 기능이기 Requires
때문에 편집 중입니다 .BindsTo
여전히 작동하지 않습니다. 존재하다sudo systemctl status service.B
service.B.service:3: openvpn-client@service에 종속성을 추가할 수 없습니다. 무시: 알 수 없는 오류-22
편집: 부분적인 해결책.
service.B에서 템플릿 서비스(service.A)를 참조하는 대신 템플릿 서비스에서 service.B를 참조하여 필요한 종속성을 생성할 수 있습니다.
그러니 서브..한 단위..
[Unit]
Before=service.B
Requires=service.B
[Service]
Type=notify
ExecStart=/usr/sbin/some.program
따라서 service.A에는 service.B가 필요하며 service.B보다 먼저 시작되어야 합니다. 이 부분은 작동하지만 서비스 A가 종료되면 서비스 B는 종료되지 않습니다.
답변1
어떻게 해야할지 오해가 있으신데체계일하다. 너의 라인 [email protected]
라인서비스.B.서비스잘못 사용되었습니다. 다음 줄을 제거하세요.서비스.B.서비스의존성을 추가하고[이메일 보호됨]좋다 Requires=service.B.service
.
systemD 문서를 주의 깊게 읽으십시오. 여기에서 시작하는 것이 좋습니다.
https://www.freedesktop.org/software/systemd/man/systemd.unit.html
당신에게 가장 흥미로운 부분은[단위] 일부 옵션. 주의 깊게 읽어보세요!
필요=
...
이 장치가 활성화되면 나열된 장치도 활성화됩니다.다른 장치 중 하나가 활성화되지 않고 주문 종속성 After=가 실패한 장치에 설정된 경우 해당 장치는 시작되지 않습니다. 또한 After= 지정 여부에 관계없이 다른 장치 중 하나가 명시적으로 중지(또는 다시 시작)되면 이 장치가 중지(또는 다시 시작)됩니다.
...
답변2
[email protected]
템플릿 서비스( ) 를 참조하는 대신 템플릿 서비스에서 필요한 종속성을 생성할 수 있습니다 .service.B
service.B
그럼 [email protected]
유닛은...
[Unit]
Before=service.B
Requires=service.B
[Service]
Type=notify
ExecStart=/usr/sbin/some.program
ExecStop=systemctl stop service.B
그러므로 [email protected]
이 작업은 이전에 시작되어야 하며 service.B
시작되어야 합니다 service.B
. 또한, ExecStop
그 전에 멈추십시오.service.B
[email protected]
나는 이 솔루션에 완전히 만족하지 않습니다. ExecStop은 구식인 것 같습니다. service.B
대신 내 것이므로 종속성을 만들고 변경 사항으로 업데이트할 수 있습니다. 종속성의 템플릿 서비스를 참조하는 방법을 배우지 못했습니다.service [email protected]
편집: [email protected]
내 것이 아니기 때문에 내 변경 사항을 업데이트할 수 있습니다. 따라서 더 좋은 방법은 systemd override를 사용하는 것입니다.
sudo systemctl edit [email protected]
[Unit]
Requires=service.B.service
Before=service.B.service
[Service]
# From docs, I think, options with lists need to be reset first
ExecStop=
ExecStop=systemctl stop service.B.service