comportamiento inesperado del temporizador systemd

comportamiento inesperado del temporizador systemd

La pregunta que hago está relacionada con el temporizador systemd y su comportamiento. Encontré un ejemplo sobre cómo trabajar con el temporizador systemd.aquí.

Aunque el enlace que proporcioné es un enlace a un sitio orientado a Fedora, este tema específico no se limita a distribuciones basadas en Red-Hat. Intenté hacer lo mismo en mi lubuntu 20.04 y aunque funciona, no funciona como esperaba. Básicamente, acabo de crear un script que genera algo de texto en el archivo (incluida la hora actual) especificado y luego creé los archivos .servicecorrespondientes .timer, de la misma manera que se hace en el ejemplo dado en el enlace que proporcioné. El problema está en las siguientes líneas en 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

Básicamente, uno esperaría que este temporizador se ejecutara schedule-test.service120 segundos después del arranque y luego cada 60 segundos mientras se ejecuta. Sin embargo, sucede lo contrario, aquí está la parte del archivo en la que el script escribe su salida:

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 puede verse, el script se ejecuta cada 120 segundos cuando el sistema se está ejecutando aunque OnUnitActiveSec=60. ¿Qué estoy haciendo mal aquí? ¿Mi razonamiento es incorrecto o esto no funciona como debería por alguna razón?

Respuesta1

systemdlos temporizadores no son precisos al segundo de forma predeterminada... Se les permite una ventana de 1 minuto desde cualquiera de los dos (en tu caso) OnBootSec=o OnUnitActiveSec=y otros(OnCalendar=, OnActiveSec=, OnStartupSec= and OnUnitInactiveSec=) ... Esta es una función de ahorro de energía predeterminada, pero puede reducir la precisión a 1 segundo (mientras que el mínimo y más preciso es 1microsegundoes decirAccuracySec=1 us) configurandoAccuracySec=1y agregándolo como una entrada adicional a su unidad de temporizador así:

[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

información relacionada