일련의 서비스 간의 상호 배타성

일련의 서비스 간의 상호 배타성

일련의 시스템 서비스가 있습니다. 이를 A.service, B.service, C.service및 이라고 부르겠습니다 D.service.

어떤 서비스든 실행하면 다른 서비스를 방해할 수 있으므로 주어진 시간에 네 가지 서비스 중 하나만 실행될 수 있도록 예약하고 싶습니다.

어떻게 해야 합니까? 이것이 최선의 방법입니까?

세부정보 및 의견

  • 모든 서비스는 장기간 실행됩니다 Type=oneshot.

  • 서비스 순서는 중요하지 않습니다.

  • 서비스의 단위 파일을 수정할 수 있습니다.

  • 최상의 솔루션은 다양한 서비스에 작동해야 합니다.

  • 최적으로 이 솔루션은 서비스가 타이머로 실행되고 부팅 시 시작되고 수동으로 시작되는 경우 작동해야 합니다. 하지만 타이머로만 작동하는 솔루션도 흥미롭습니다.

  • B가 이미 실행 중일 때(타이머를 통해 또는 수동으로) A가 시작되는 경우 A는 B가 완료될 때까지 기다린 다음 A를 시작해야 합니다.

  • 다른 서비스 전후에 각 서비스를 선언하면 문제를 해결할 수 있을 것입니다. 하지만 아직 이 작업을 수행하는 방법을 찾지 못했습니다. 또한 매우 혼란스러울 수 있으며 더 많은 서비스로 확장되지 않습니다.

  • 어쩌면 문제는 "슬라이싱"과 리소스 제어를 사용하여 어떤 방식으로든 해결될 수 있지만 방법을 알 수는 없습니다.

  • TasksMax=1서비스가 아닌 스레드를 계산하기 때문에 잘못된 것 같습니다.

  • 시작하려는 다른 서비스에 의해 한 서비스가 작동 방식으로 중지되는 것을 원하지 않습니다 Conflicts=.

  • 가장 좋은 해결책은 MutualExclution=my-exclution-tag동일한 레이블을 가진 하나의 유닛만 동시에 실행되도록 유닛 파일에 가상 항목을 추가하는 것입니다. 하지만 그런 단위 파일 항목은 존재하지 않는 것 같습니다.

답변1

systemd에는 귀하가 설명하는 매우 구체적인 의미를 지원하는 도구가 내장되어 있지 않다고 생각하지만 잠금 파일을 사용하면 원하는 것을 쉽게 얻을 수 있는 것 같습니다. 각 서비스에 대해 실행하는 대신 /some/script/or/program다음 호출로 래핑합니다 flock.

ExecStart = /usr/bin/flock /tmp/my-exclusion-lock /some/script/or/program

서비스가 실행 중인 경우 다른 서비스는 잠금을 획득하려는 시도를 차단합니다. 실행 중인 서비스가 종료되면 잠금이 해제되고 대기 중인 서비스 중 하나가 실행되기 시작합니다.

관련 정보