시스템 단위 파일: 종속성 "After=/Before="가 작동하지 않습니다.

시스템 단위 파일: 종속성 "After=/Before="가 작동하지 않습니다.

systemd유닛 파일에 설명된 두 서비스 간의 종속성을 생성하려고 합니다 .

  • a.service는 b.service보다 먼저 시작되어야 합니다.
  • a.service가 실패하면 b.service를 시작할 수 없습니다.

이것이 내가 가진 것입니다:

% cat a.service
[Unit]
Description=A-Service
Before=b.service

[Service]
ExecStart=/opt/a.sh

[Install]
WantedBy=multi-user.target

% cat b.service
[Unit]
Description=B-Service
After=a.service

[Service]
ExecStart=/opt/b.sh

[Install]
WantedBy=multi-user.target

다음은 서비스 A와 B에 대해 실행되는 간단한 스크립트입니다.

% cat a.sh
#!/bin/sh
echo "A service started"
exit 0

% cat b.sh
#!/bin/sh
echo "B service started"
while [ true ]; do
   sleep 1
do
exit 0

그래서 다음에서 반환 하여 exit 1실패를 시뮬레이션/서비스 하려고했습니다 .a.shsystemctl status a.service

Active: failed (Result: exit-code) ...
Process: 843 ExecStart=/opt/a.sh (code=exited, status=1/FAILURE)
...

그러나 b.service는 여전히 시작되어 활성 상태입니다.

% systemctl status b.service
...
Active: active (running) ...
Process: 844 ExecStart=/opt/b.sh (code=exited, status=0/SUCCESS)
...

또한 b.service 종속성은 a.service("실패" 상태)를 포함합니다.

% systemctl list-dependencies b.service
...

내가 뭘 잘못했나요? 스크립트에 문제가 있는 걸까요, 아니면 [단위] 정의가 불완전한 걸까요?

답변1

나는 하나를 사용할 것이다Requires두 번째 장치의 속성:

이 장치가 활성화되면 나열된 장치도 활성화됩니다. 다른 장치 중 하나가 활성화되지 않고 주문 종속성 After=가 실패한 장치에 설정된 경우 해당 장치는 시작되지 않습니다.

또한 분기할 각 유닛의 유형을 변경했습니다. 기본 유형 "simple"은 셸이 시작된 후에 해당 유닛이 시작된다고 생각하는 반면, 분기된 유닛은 셸이 종료될 때까지 기다리기 때문입니다. 이러한 유형의 변경은 여기서 A-Service에만 중요합니다.

또한 Before=b.serviceB에서 A로의 역방향 종속성(B의 "After" 지시문 사용)이 나에게 더 적합하고 둘 다 가질 필요가 없기 때문에 A-Service에서 이를 제거했습니다.

생성된 유닛 파일은 다음과 같습니다.

[Unit]
Description=A-Service

[Service]
Type=forking
ExecStart=/opt/a.sh

[Install]
WantedBy=multi-user.target

그리고:

[Unit]
Description=B-Service
Requires=a.service
After=a.service

[Service]
Type=forking
ExecStart=/opt/b.sh

[Install]
WantedBy=multi-user.target

관련 정보