시스템 타이머는 persist=false인 경우에도 주기당 여러 번 실행됩니다.

시스템 타이머는 persist=false인 경우에도 주기당 여러 번 실행됩니다.

평소에는 실행하고 싶은 장치가 있는데 가끔 수동으로 종료했다가 자동으로 다시 시작하고 싶은 경우가 있습니다. 그래서 다시 시작하는 타이머가 있습니다 OnCalendar=daily. 이 방법은 작동하지만 타이머가 장치를 즉시 다시 시작하기 때문에 장치를 두 번 중지해야 하는 경우가 있습니다.

다음은 일수가 아닌 분만 사용되는 간단한 예입니다.

[Unit]
Description=foo timer

[Timer]
Persistent=false
OnCalendar=minutely
AccuracySec=1
Unit=foo.service

[Install]
WantedBy=default.target

[Unit]
Description=foo service

[Service]
Type=simple
ExecStart=/bin/sh -c 'while true; do sleep 1; done'

[Install]
WantedBy=default.target

I systemctl stop foo.service와 타이머가 1분 전에(1m 이상 systemdctl list-timers) 트리거된 경우 즉시 다시 트리거되어 장치를 시작합니다. 두 번 중지하면 장치는 다음 순간까지 항상 중지된 상태로 유지됩니다. 문서에서는 Persistent=false이로 인해 발생하는 것처럼 들리지 않지만 분명히 제가 오해한 것 같습니다. 중요하다면 제가 정말 관심을 갖고 있는 일일 단위는 시스템 단위이지만 테스트 단위는 사용자 단위입니다.

답변1

Persistent=false(즉, 기본값) 시스템 종료 중에 누락된 타이머를 캡처하는 기능을 비활성화된 상태로 둡니다. 귀하의 경우 시스템은 온라인 상태이고 타이머는 생략되었습니다. OnCalendar기간이 경과한 경우(아마도 foo.service가 이미 실행 중이기 때문에) 여전히 "1분/일"이 실행되는 순간을 기다립니다.마지막 실행 이후" - 아니요마지막 시도/확인/실행 시도 후, 이는 정확히 의미합니다.foo.service 중지 직후.

이것은 견적의 결과입니다 man systemd.timer.타이머가 종료될 때 활성화할 장치가 이미 활성화된 경우 장치는 다시 시작되지 않고 계속 실행됩니다.. 현재 타이머가 경과했지만 서비스가 계속 실행 중이어서 작업을 건너뛴 경우 타이머를 재설정하는 직접적인 방법이 없습니다.

간접적인 방법은자체 재시작 타이머, 유사 foo-try_restart.service systemctl restart foo-try_restart.timer이전에 전화함귀하의 것이 새로 생성된 것과 다르기 systemctl start foo.service때문에 (포함, 미포함) 항상 실행되므로 매 주기마다 타이머가 재설정 됩니다 .foo.servicefoo-try_restart.serviceType=oneshotRemainAfterExitfoo-try_restart.timer

관련 정보