편집 1

편집 1

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

  1. 타이머 장치는 WantedBy=timer.target해당 [Install]섹션에 있어야 합니다.

  2. 시작 순서의 특정 지점에서 시작하려면 타이머 및/또는 서비스 장치에 Before=및/또는 등과 같은 지침을 추가해야 합니다.After=[Unit]

  3. 이 맥락에서 "실시간"과 "주기적"의 차이가 무엇을 의미하는지 잘 모르겠습니다. 왜냐하면 타이머 단위가 실제로 OnCalendar="주기적"으로 만드는 전부이기 때문입니다.

  4. *:0/55분마다 활성화됨을 나타내며, 특정한 시작 시간이 없으므로 시작 후 최대한 빨리 시작됩니다. 출력을 참조하세요.systemd-analyze calendar --iterations=10 '*:0/5'

답변2

유레카!

문제는 시간을 올바르게 초기화하지 않는다는 것입니다.

응, 신경썼어이 게시물/sbin/hwclock --hctosys --utc --noadjfile하지만 시간을 지연시키는 명령이 포함된 스크립트를 사용했습니다 . 이렇게 하면 부팅 순서가 이미 시작되어 항목 OnCalendar=(예:타이머 매뉴얼 페이지).

다음과 같은 서비스를 추가하는 것으로 충분합니다.이것, 다른 것을 변경할 필요가 없습니다.

관련 정보