데스크탑에서 12시에서 13시 사이에 프로그램이 활성화되기를 원한다고 가정해 보겠습니다(즉, PC가 언제든지 켜져 있다는 보장은 없습니다). 나는 이것을 위해 systemd 단위를 사용할 수 있다고 가정합니다.
A
타이머를 사용하여 서비스를 시작하고 중단 시간을 계산하는 것은 쉽습니다.
A.타이머
[Timer]
Unit=A
OnCalendar=*-*-* 12:00:00
Persistent=true
A
아래와 같이 충돌하는 서비스로 인해 중지될 수 있습니다.이전에 제안된
서비스(갈등):
#add conflict to A.service
[Unit]
Description=This is A.service
Conflicts=killA.service
#make sure killA considers A to be active
RemainAfterExit=yes
서비스 A를 죽여라:
[Unit]
Description=kills A
[Service]
Type=oneshot
ExecStart=/bin/true
#kill only if A is running:
Requires=A.service
타이머 종료
[Timer]
Unit=killA
OnCalendar=*-*-* 13:00:00
Persistent=true
이제 몇 가지 가능한 시나리오가 있습니다.
- 11:00부터 14:00까지 전원 켜기: 예상대로 시작 및 중지
11시부터 12시 30분까지 전원 켜짐: 예상대로 시작되지만 절대 멈추지 않음 -> 다음에 전원이 공급되면 어떻게 되나요?
- 12:45: A가 시작되나요? (24시간 이내에 마지막으로 실행됨)
- 14시간: A가 활성화되어서는 안 되기 때문에 killA가 실행되어서는 안 됩니다.
- 다음날 12시 15분? (마지막 부팅이 24시간도 안됐는데 KillA 부팅이 누락되었습니다.)
- 다음날 12시 45분? (24시간 전에 마지막으로 시작했지만 killA는 24시간 미만 전에 시작되었습니다. killA에 의해 중지됩니까?)
12:30 ~ 14h 전원 켜기: 예상대로 시작 및 중지(A.timer 지속성으로 인해)
전원 켜짐 14시간: 내구성으로 인해 A가 시작됩니다. killA는 종속성으로 인해 즉시 비활성화됩니까? 애초에 A를 시작하는 것을 피할 수 있을까요?
간단히 말해서:
시스템 타이머를 사용하여 종료/시작에 관계없이 서비스가 지정된 간격 내에서 활성화되고 간격 외부에서 비활성화되도록 하려면 어떻게 해야 합니까?
실제 사용 사례 예: ssh
업무 시간에만 액세스를 허용합니다.
추신: 아직 시스템 타이머에 대해 잘 모르는 것 같습니다.
답변1
나는 같은 요구 사항을 가지고 있습니다.
두 타이머 모두 시작을 따라잡으면 경쟁 조건이 발생하고 임의의 결과가 생성되는 것을 확인할 수 있습니다.
그렇다면 시스템 재시작 시나리오는 어떻습니까?한 번 이상12시에서 13시 사이. Persistent
아마도 이 경우에는 아무런 도움이 되지 않을 것입니다.
내 결론은 (그러나 틀렸다는 것이 증명되기를 바랍니다) systemd는 이 사용 사례에 적합하지 않다는 것입니다.
내 해결 방법은 플래그 없이 위의 구성을 사용하는 것이었습니다 Persistent
. 그런 다음 idle
시작 후 상태를 처리하기 위해 특별히 새 서비스를 만듭니다 . 서비스는 현재 시간과 현재 대상 서비스 상태를 비교하여 불일치할 경우 서비스를 시작/중지합니다. 시작/중지 시간은 타이머와 "시작 관리자" 서비스 스크립트에서 반복되어야 하는데 이는 이상적이지 않습니다.
이것이 여러 번 다시 시작하더라도 선택한 기간 동안 서비스가 실행되도록 보장하는 신뢰할 수 있는 유일한 방법입니다.