systemd에서 한 방향으로만 충돌을 설정하는 방법

systemd에서 한 방향으로만 충돌을 설정하는 방법

A두 가지 시스템 서비스 (몇 분 소요)와 B(몇 초 소요)가 있습니다 .

  • A우선순위가 높으며 모든 상황에서 실행되어야 합니다.
  • BA런타임이 시작되지 않지만 여전히 문제 없이 런타임이 시작됩니다. 모든 경우에 실행 중이어야 하므로 실행 중인 동안에도 시작하고 싶을 수도 있습니다.ABABA
  • BConflicts=서비스가 중지될 때 서비스가 종료되어서는 안 되며, 대신 계속 실행이 완료되어야 합니다.

이것시스템 사람말해 주세요:

부정적인 요구 사항 종속성을 구성합니다. 한 유닛이 다른 유닛에 충돌=을 설정한 경우 전자를 시작하면 후자는 중지됩니다.그 반대로.

Conflicts=A.service사용하는 것이 해결책이 될 수 있다고 생각합니다 . 남자들은 시작한 곳에서 A멈출 것이라고 말하지만 B, 내가 원하지 않는 것은 그것이 B멈추는 것입니다 A.

Conflicts=한 방향만 가질 수 있는 방법이 있나요 ?

답변1

이 명령은 양방향으로 작동할 뿐만 아니라 시작 시 현재 실행 중인 작업(실행 중인 경우)을 중지 Conflict=하고 싶지 않기 때문에 실제로 원하는 것이 아닙니다 .B.serviceA.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-activeA.service현재 서비스가 실행 중인지 확인하세요 .

그렇지 않은 경우 메시지를 표시합니다(이 메시지는 결국 로그에 표시되며 더 중요한 것은 확인할 때마다 표시됩니다 systemctl status B.service.) 또한 0이 아닌 상태로 종료됩니다. systemd가 EX_TEMPFAIL"일시적 실패, 사용자가 다시 시도하도록 초대됨"을 의미하는 코드를 표시하기 때문에 종료 코드 75를 선택했습니다 . 바라보다여기systemd가 프로세스 종료 코드를 해석하고 이름을 지정하는 방법을 알아보세요.

줄 바꿈도 선택 사항입니다. 모든 내용을 한 줄에 작성하고 \뒤의 줄 바꿈을 생략하면 됩니다.

관련 정보