systemd에서 매개변수를 사용하여 서비스에 대한 종속성을 만드는 방법은 무엇입니까?

systemd에서 매개변수를 사용하여 서비스에 대한 종속성을 만드는 방법은 무엇입니까?

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.Bservice.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

관련 정보