시스템 타이머를 정확히 10분마다 실행하고 작업이 약간 더 오래 지속되도록 하려면 어떻게 해야 합니까?

시스템 타이머를 정확히 10분마다 실행하고 작업이 약간 더 오래 지속되도록 하려면 어떻게 해야 합니까?

시스템 타이머와 드리프트 시작 시간에 다소 짜증나는 문제가 있습니다. 현대화하려고 하는 오래된 cron.d 스크립트(10분마다 충실하게 실행됨)가 있습니다. 문제는 시작된 서비스가 10분 넘게 실행되고 있다는 점이다. cron을 사용하면 이는 문제가 되지 않았습니다. 잠시 동안 두 인스턴스를 모두 실행했지만 systemd는 다르게 작동합니다.

타이머는 다음과 같습니다.

[Timer]
OnCalendar=*:0/10:0
Persistent=false
AccuracySec=1s

내가 아는 바로는 이 작업은 정확히 08:00:00, 08:10:00, 08:20:00 등에 실행되어야 합니다. 그러나 시작되는 관련 서비스는 10분보다 조금 더 오래 실행되므로 타이머가 실행될 때마다 약 10초씩 점차적으로 드리프트됩니다. 즉, 시작 시간은 08:00:00, 08:10:10, 08:20:20 등입니다. 타이머가 내가 원하는 대로 작동하도록 강제할 수 있는 방법이 있나요?

또한 백그라운드에서 서비스를 실행 상태로 두려고 시도했지만모니터링되지 않은systemd에서 제공하지만 이것으로 많은 성공을 거두지 못했습니다. 전체 명령을 별도의 쉘 스크립트에 넣는 것과 ExecStart=/bin/sh -c "/run/my/cmd -options &"같은 것을 시도했지만 소용이 없었습니다. 즉시 시작하거나 종료 nohup하지 않습니다 .cmd

그렇다면 시스템 타이머를 이전 cron 스크립트처럼 실행하려면 어떻게 해야 합니까? 유일하게 남은 아이디어/해결 방법은 간격이 20분으로 설정된 두 개의 타이머를 만드는 것인데, 그건 매우 어리석은 생각처럼 들립니다.

답변1

이러한 유형의 동작은 직접 지원되지 않는 것처럼 보입니다 systemd. 이는 실행되는 모든 서비스를 추적하는 방식으로 인해 의미가 있습니다. 결국 10분마다 실행되는 대신 20분마다 실행되는 두 개의 동일한 서비스를 만들어야 했습니다.

관련 타이머 부분은 다음과 같습니다.

myservice-even.timer

[Timer]
OnCalendar=*:0/20:0
Persistent=false
AccuracySec=1s

그리고

myservice-이상한 타이머

[Timer]
OnCalendar=*:10/20:0
Persistent=false
AccuracySec=1s

RuntimeMaxSec=900또한, 잘못된 행동을 하더라도 다음 라운드가 적절한 시간에 시작되도록 두 서비스를 모두 포함했습니다 .

답변2

프로세스를 비동기적으로(그리고 다른 인스턴스와 독립적으로) 시작하려면 를 systemd-run사용하여 systemd-run임시 서비스 또는 범위 단위를 생성 할 수 있습니다. 기본적으로 장치에 대한 고유 이름을 자동으로 생성합니다.

즉, systemd 서비스 S를 사용하여 systemd-run프로세스 P를 시작할 수 있습니다. systemd-runP가 완료될 때까지 기다리지 않습니다(이 --wait옵션을 사용하지 않는 한). 프로세스 P는 서비스 S의 일부가 되지 않습니다. 그리고 서비스 S가 중지되더라도 프로세스 P는 종료되지 않습니다.

원한다면 --property RuntimeMaxSec=900with 와 같은 옵션을 사용할 수 있어야 합니다 systemd-run. (정확히 설정할 수 있는 속성은 systemd-run약간 다릅니다. 이전 버전의 systemd에서는 임시 장치에 많은 속성을 설정할 수 없었습니다.)

제공된 것보다 더 복잡한 컨트롤을 추가해야 하거나 cron임시 서비스 단위가 제공할 수 있는 것보다 더 복잡한 컨트롤을 추가해야 하는 경우 필요한 기능이 있는 다른 작업 스케줄러를 찾아야 할 수도 있습니다. 또는 하위 프로세스를 생성하고 해당 상태를 모니터링하는 서비스를 직접 작성하세요. :-). (너할 수 있다그러한 서비스에 메시지를 보내기 위해 여전히 systemd 타이머를 사용하고 있지만, 그다지 깔끔해 보이지는 않는 것 같습니다. 이해하기 쉽게 하시려면 서비스 자체에서 타이머를 구현해 주시는 것이 좋을 것 같습니다. )

관련 정보