Persistent=false
내 목표는 주기적으로 실행하는 것이지만 시작 후 즉시 실행되는 실시간 타이머가 있습니다 !
나는 이것이 매우 일반적인 질문이라고 생각했지만 StackExchange에서 찾은 답변 중 어느 것도 내 문제를 해결하지 못했습니다. 나는 그 조언을 따랐다.이 게시물그리고이 게시물.
여기에서는 내 문제를 재현하기 위한 간단한 예를 보고합니다. 타이머가 5분(0,5,10,15,...55)마다 실행되지만 시작된 후에는 실행되지 않기를 원합니다.
sudo systemctl edit --force --full test.service
사용 하고 생성하는 다음 두 파일이 있습니다.
sudo systemctl edit --force --full test.timer
# test.service
[Unit]
Description=test
[Service]
Type=simple
ExecStart=echo "TEST"
# test.timer
[Unit]
Description=test
[Timer]
OnCalendar=*:0/5
Persistent=false
[Install]
WantedBy=default.target
그런 다음 다음 명령을 사용하여 서비스를 비활성화
sudo systemctl disable test.service
하고 다음 명령을 사용하여 타이머를 활성화했습니다.
sudo systemctl enable test.timer
이제 sudo restart가 실행되면 test.service
즉시 실행됩니다.
journalctl -u test
좋다:
-- Journal begins at Thu 2023-08-24 02:39:59 UTC, ends at Thu 2023-08-24 19:40:14 UTC. --
Aug 24 19:33:02 rbpi0 systemd[1]: Started test.
Aug 24 19:33:02 rbpi0 echo[463]: TEST
Aug 24 19:33:03 rbpi0 systemd[1]: test.service: Succeeded.
Aug 24 19:35:14 rbpi0 systemd[1]: Started test.
Aug 24 19:35:14 rbpi0 echo[911]: TEST
Aug 24 19:35:14 rbpi0 systemd[1]: test.service: Succeeded.
Aug 24 19:40:14 rbpi0 systemd[1]: Started test.
Aug 24 19:40:14 rbpi0 echo[1352]: TEST
Aug 24 19:40:14 rbpi0 systemd[1]: test.service: Succeeded.
시작 test.service
시 실행된 것을 명확하게 볼 수 있습니다 .19:33
오류가 어디에 있는지 아는 사람이 있나요?
편집 1
이 부분을 변경해 보았습니다 [Install]
.
- 시도 1:
[Install]
섹션을 완전히 제거합니다.
결과:
The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
Alias= settings in the [Install] section, and DefaultInstance= for template units).
This means they are not meant to be enabled using systemctl.
- 시도 2: 변경
WantedBy=default.target
또는WantedBy=timer.target
결과WantedBy=multi-user.target
: 동일한 문제입니다.
편집 2
독서로타이머 매뉴얼 페이지나는 시스템 시계가 이전에 동기화되었는지 확인해야 한다는 것을 알았습니다 time-sync.target
. 시계가 동기화되었는지 확인했지만 문제가 지속됩니다.
답변1
타이머 장치는
WantedBy=timer.target
해당[Install]
섹션에 있어야 합니다.시작 순서의 특정 지점에서 시작하려면 타이머 및/또는 서비스 장치에
Before=
및/또는 등과 같은 지침을 추가해야 합니다.After=
[Unit]
이 맥락에서 "실시간"과 "주기적"의 차이가 무엇을 의미하는지 잘 모르겠습니다. 왜냐하면 타이머 단위가 실제로
OnCalendar=
"주기적"으로 만드는 전부이기 때문입니다.*:0/5
5분마다 활성화됨을 나타내며, 특정한 시작 시간이 없으므로 시작 후 최대한 빨리 시작됩니다. 출력을 참조하세요.systemd-analyze calendar --iterations=10 '*:0/5'
답변2
유레카!
문제는 시간을 올바르게 초기화하지 않는다는 것입니다.
응, 신경썼어이 게시물/sbin/hwclock --hctosys --utc --noadjfile
하지만 시간을 지연시키는 명령이 포함된 스크립트를 사용했습니다 . 이렇게 하면 부팅 순서가 이미 시작되어 항목 OnCalendar=
(예:타이머 매뉴얼 페이지).
다음과 같은 서비스를 추가하는 것으로 충분합니다.이것, 다른 것을 변경할 필요가 없습니다.