A pergunta que estou fazendo está relacionada ao temporizador do systemd e ao seu comportamento. Encontrei um exemplo de como trabalhar com o timer do systemdaqui.
Embora o link que forneci seja um link para um site orientado ao Fedora, este tópico específico não se limita às distribuições baseadas no Red Hat. Tentei fazer o mesmo no meu lubuntu 20.04 e embora funcione, não funciona do jeito que eu esperava. Basicamente, acabei de criar um script que gera algum texto no arquivo (incluindo a hora atual) especificado e então criei os arquivos .service
correspondentes .timer
, da mesma forma que é feito no exemplo dado no link que forneci. O problema está nas seguintes linhas 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
Então, basicamente, seria de esperar que esse cronômetro funcionasse schedule-test.service
120 segundos após a inicialização e depois a cada 60 segundos durante a execução. Porém, acontece o contrário, aqui está a parte do arquivo em que o script grava sua saída:
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
Como pode ser visto, o script é executado a cada 120 segundos quando o sistema está em execução, mesmo que o
OnUnitActiveSec=60
. O que estou fazendo de errado aqui, meu raciocínio está errado ou isso não funciona como deveria por algum motivo?
Responder1
systemd
os temporizadores não têm precisão de segundo por padrão ... Eles têm uma janela de 1 minuto a partir de qualquer um (no seu caso) OnBootSec=
ou OnUnitActiveSec=
e outros (OnCalendar=, OnActiveSec=, OnStartupSec= and OnUnitInactiveSec=
) ... Este é um recurso padrão de economia de energia, mas você pode reduzir a precisão para 1 segundo(enquanto o mínimo e mais preciso é 1microssegundoou sejaAccuracySec=1 us
) definindoAccuracySec=1
e adicionando-o como uma entrada extra à sua unidade de cronômetro, assim:
[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