Systemd 타이머는 예약된 서비스를 1회가 아닌 연속 2회 실행합니다.

Systemd 타이머는 예약된 서비스를 1회가 아닌 연속 2회 실행합니다.

매시간 40분마다 실행해야 하는 nodejs GUI 프로그램(사용자 상호 작용이 필요하지 않음)이 있습니다. 오후 5시 40분, 오후 6시 40분, 오후 7시 40분 등으로 실행된다고 가정합니다. 데비안 서버에서 다음 명령을 사용하여 systemd 타이머를 활성화했습니다.

systemctl --user enable my_program.timer

문제는 일정이 주어진 시간에 시작되어 성공적으로 완료된다는 것입니다. 그러나 프로그램은 즉시 다시 시작되어 성공적으로 완료됩니다.

쇼가 오후 5시 40분에 시작해서 오후 5시 45분에 끝난다고 가정해 보겠습니다. 약 1분 후, 예를 들어 오후 5시 46분에 프로그램이 다시 시작되고 종료됩니다. 그러다가 다음번 오후 6시 40분에 이런 일이 다시 발생합니다.

이것은 매 시간마다 발생합니다. 또한 해당 사용자 계정으로 로그인한 후 서버를 다시 시작하면 5분을 기다리지 않고 바로 프로그램이 시작됩니다.

  1. 두 번째 자동 실행을 중지하는 방법은 무엇입니까?
  2. 5분 후에 강제로 다시 시작하는 방법은 무엇입니까?

콘텐츠/home/user/schedule.sh

#! /usr/bin/bash
cd /home/user/my_program && DISPLAY=:0 /usr/bin/node ./index.js

콘텐츠/home/user/.config/systemd/user/my_program.service

[Unit]
Description=My Program

[Service]
ExecStart=/home/user/schedule.sh

콘텐츠/home/user/.config/systemd/user/my_program.timer

[Unit]
Description=My Program Timer
Requires=my_program.service

[Timer]
Unit=my_program.service
OnCalendar=*-*-* *:40:*
OnBootSec=5 minutes

[Install]
WantedBy=timers.target

답변1

여기서는 한 가지 문제, 즉 매시간 실행되는 반복 실행에 집중하겠습니다. 다음 구문을 사용했습니다.

OnCalendar=*-*-* *:40:*

초의 와일드카드 표현은 man systemd.time매시간 40분의 매초와 일치합니다. 달력 하위 명령이 포함된 도구를 사용하여 systemd-analyze이를 확인할 수 있습니다.

systemd-analyze calendar --iterations=5 "*-*-* *:40:*"
Normalized form: *-*-* *:40:*
    Next elapse: Thu 2020-12-17 17:40:00 EST
       (in UTC): Thu 2020-12-17 22:40:00 UTC
       From now: 15min left
       Iter. #2: Thu 2020-12-17 17:40:01 EST
       (in UTC): Thu 2020-12-17 22:40:01 UTC
       From now: 15min left
       Iter. #3: Thu 2020-12-17 17:40:02 EST
       (in UTC): Thu 2020-12-17 22:40:02 UTC
       From now: 15min left
       Iter. #4: Thu 2020-12-17 17:40:03 EST
       (in UTC): Thu 2020-12-17 22:40:03 UTC
       From now: 15min left
       Iter. #5: Thu 2020-12-17 17:40:04 EST
       (in UTC): Thu 2020-12-17 22:40:04 UTC
       From now: 15min left

그래서 이것은 문제입니다.

Requires=두 번째 문제는 타이머에 포함했다는 것입니다 . 에서 man systed.unit이 지시어에 대한 문서에는 Requires=다음과 같이 나와 있습니다.

이 유닛이 활성화되면 [In Requires=]에 나열된 유닛도 활성화됩니다.

따라서 이로 인해 대상 서비스가 두 번째로 로드될 수도 있습니다.

시간에 대한 새로운 질문을 제기하는 OnBootSec=것은 별개의 질문입니다.

관련 정보