Die Frage, die ich stelle, bezieht sich auf den systemd-Timer und sein Verhalten. Ich habe ein Beispiel für die Arbeit mit dem systemd-Timer gefundenHier.
Obwohl der von mir angegebene Link zu einer Fedora-orientierten Site führt, ist dieses spezielle Thema nicht auf Red-Hat-basierte Distributionen beschränkt. Ich habe versucht, dasselbe auf meinem Lubuntu 20.04 zu tun, und obwohl es funktioniert, funktioniert es nicht so, wie ich es erwartet habe. Im Grunde habe ich einfach ein Skript erstellt, das einen Text in der angegebenen Datei ausgibt (einschließlich der aktuellen Uhrzeit), und dann habe ich .service
die entsprechenden .timer
Dateien erstellt, so wie es im Beispiel unter dem von mir angegebenen Link gemacht wird. Das Problem liegt bei den folgenden Zeilen in 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
Man würde also grundsätzlich erwarten, dass dieser Timer 120 Sekunden nach dem Booten und dann alle 60 Sekunden während der Ausführung läuft schedule-test.service
. Das Gegenteil ist jedoch der Fall. Hier ist der Teil der Datei, in den das Skript seine Ausgabe schreibt:
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
Wie man sehen kann, wird das Skript alle 120 Sekunden ausgeführt, wenn das System läuft, obwohl
OnUnitActiveSec=60
. Was mache ich hier falsch, ist meine Argumentation falsch oder funktioniert es aus irgendeinem Grund nicht so, wie es sollte?
Antwort1
systemd
Timer sind standardmäßig nicht auf die Sekunde genau ... Ihnen steht ein Zeitfenster von 1 Minute zur Verfügung (in Ihrem Fall) OnBootSec=
oder OnUnitActiveSec=
und andere (OnCalendar=, OnActiveSec=, OnStartupSec= and OnUnitInactiveSec=
) ... Dies ist eine standardmäßige Energiesparfunktion, aber Sie können die Genauigkeit auf 1 Sekunde reduzieren(während das Minimum und die genaueste 1 istMikrosekundedhAccuracySec=1 us
) indem man es einstelltAccuracySec=1
und fügen Sie es als zusätzlichen Eintrag zu Ihrer Timer-Einheit hinzu, wie folgt:
[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