A
두 가지 시스템 서비스 (몇 분 소요)와 B
(몇 초 소요)가 있습니다 .
A
우선순위가 높으며 모든 상황에서 실행되어야 합니다.B
A
런타임이 시작되지 않지만 여전히 문제 없이 런타임이 시작됩니다. 모든 경우에 실행 중이어야 하므로 실행 중인 동안에도 시작하고 싶을 수도 있습니다.A
B
A
B
A
B
Conflicts=
서비스가 중지될 때 서비스가 종료되어서는 안 되며, 대신 계속 실행이 완료되어야 합니다.
이것시스템 사람말해 주세요:
부정적인 요구 사항 종속성을 구성합니다. 한 유닛이 다른 유닛에 충돌=을 설정한 경우 전자를 시작하면 후자는 중지됩니다.그 반대로.
Conflicts=A.service
사용하는 것이 해결책이 될 수 있다고 생각합니다 . 남자들은 시작한 곳에서 A
멈출 것이라고 말하지만 B
, 내가 원하지 않는 것은 그것이 B
멈추는 것입니다 A
.
Conflicts=
한 방향만 가질 수 있는 방법이 있나요 ?
답변1
이 명령은 양방향으로 작동할 뿐만 아니라 시작 시 현재 실행 중인 작업(실행 중인 경우)을 중지 Conflict=
하고 싶지 않기 때문에 실제로 원하는 것이 아닙니다 .B.service
A.service
이를 달성하기 위해 제가 제안하는 방법은 실행 중인지 B.service
확인한 A.service
다음 B.service
이 경우 시작되지 않도록 하는 추가 스크립트를 추가하는 것입니다.
0이 아닌 상태의 종료를 추가하여 이를 수행할 수 있습니다 ExecStartPre=
. 이렇게 하면 시작 프로세스에서 더 이상 진행되지 않습니다.B.service
내 제안은 기존 항목에 다음과 같은 것을 추가하는 것입니다 /etc/systemd/system/B.service
.
ExecStartPre=/bin/sh -c 'if systemctl -q is-active A.service; then \
echo "A.service already running, will not start B.service"; \
exit 75; \
fi'
이는 다음을 사용합니다.systemctl is-active
A.service
현재 서비스가 실행 중인지 확인하세요 .
그렇지 않은 경우 메시지를 표시합니다(이 메시지는 결국 로그에 표시되며 더 중요한 것은 확인할 때마다 표시됩니다 systemctl status B.service
.) 또한 0이 아닌 상태로 종료됩니다. systemd가 EX_TEMPFAIL
"일시적 실패, 사용자가 다시 시도하도록 초대됨"을 의미하는 코드를 표시하기 때문에 종료 코드 75를 선택했습니다 . 바라보다여기systemd가 프로세스 종료 코드를 해석하고 이름을 지정하는 방법을 알아보세요.
줄 바꿈도 선택 사항입니다. 모든 내용을 한 줄에 작성하고 \
뒤의 줄 바꿈을 생략하면 됩니다.