일련의 시스템 서비스가 있습니다. 이를 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
서비스가 실행 중인 경우 다른 서비스는 잠금을 획득하려는 시도를 차단합니다. 실행 중인 서비스가 종료되면 잠금이 해제되고 대기 중인 서비스 중 하나가 실행되기 시작합니다.