Вопрос, который я задаю, связан с таймером systemd и его поведением. Я нашел пример того, как работать с таймером systemdздесь.
Несмотря на то, что предоставленная мной ссылка ведет на сайт, ориентированный на Fedora, эта конкретная тема не ограничивается дистрибутивами на основе Red Hat. Я попытался сделать то же самое на моем Ubuntu 20.04, и хотя это работает, это работает не так, как я ожидал. По сути, я просто создал скрипт, который выводит некоторый текст в указанном файле (включая текущее время), а затем создал .service
соответствующие .timer
файлы, так же, как это сделано в примере, приведенном в предоставленной мной ссылке. Проблема в следующих строках в schedule-test.timer
:
[Unit]
Description=Schedule a message every 1 minute
RefuseManualStart=no
RefuseManualStop=no
[Timer]
#Execute job if it missed a run due to machine being off
Persistent=true
#Run 120 seconds after boot for the first time
OnBootSec=120
#Run every 1 minute thereafter
OnUnitActiveSec=60
#File describing job to execute
Unit=schedule-test.service
[Install]
WantedBy=timers.target
Так что в принципе можно было бы ожидать, что этот таймер будет работать schedule-test.service
120 секунд после загрузки, а затем каждые 60 секунд во время работы. Однако происходит обратное, вот часть файла, в котором скрипт записывает свой вывод:
This is only a test: Sat 30 Jul 2022 08:43:41 AM
This is only a test: Sat 30 Jul 2022 08:45:41 AM
This is only a test: Sat 30 Jul 2022 08:47:41 AM
This is only a test: Sat 30 Jul 2022 08:49:41 AM
This is only a test: Sat 30 Jul 2022 08:51:41 AM
Как можно увидеть, скрипт запускается каждые 120 секунд, когда система работает, хотя
OnUnitActiveSec=60
. Что я делаю не так, мои рассуждения неверны или это по какой-то причине не работает так, как должно?
решение1
systemd
Таймеры по умолчанию не точны до секунды... Им разрешено окно в 1 минуту от любого(в твоем случае) OnBootSec=
или OnUnitActiveSec=
и другие(OnCalendar=, OnActiveSec=, OnStartupSec= and OnUnitInactiveSec=
) ... Это функция энергосбережения по умолчанию, но вы можете снизить точность до 1 секунды(в то время как минимальное и наиболее точное значение — 1микросекундато естьAccuracySec=1 us
) установивAccuracySec=1
и добавив его как дополнительную запись в ваш таймер, например, так:
[Unit]
Description=Schedule a message every 1 minute
RefuseManualStart=no
RefuseManualStop=no
[Timer]
#Execute job if it missed a run due to machine being off
Persistent=true
#Set the timer accuracy to 1 second instead of the default 1 minute
AccuracySec=1
#Run 120 seconds after boot for the first time
OnBootSec=120
#Run every 1 minute thereafter
OnUnitActiveSec=60
#File describing job to execute
Unit=schedule-test.service
[Install]
WantedBy=timers.target