我問的問題與 systemd 計時器及其行為有關。我找到了一個有關如何使用 systemd 計時器的範例這裡。
儘管我提供的鏈接是指向面向 Fedora 的網站的鏈接,但該特定主題並不限於基於 Red Hat 的發行版。我嘗試在我的 lubuntu 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微秒IEAccuracySec=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