매시간 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분을 기다리지 않고 바로 프로그램이 시작됩니다.
- 두 번째 자동 실행을 중지하는 방법은 무엇입니까?
- 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=
것은 별개의 질문입니다.