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 .service
correspondientes .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.service
120 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
systemd
los 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=1
y 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