systemctl 持久计时器和服务,当计算机关闭时

systemctl 持久计时器和服务,当计算机关闭时

怎样做系统控制 计时器当计算机在给定的触发时间关闭时有效吗?有选项“ Persistent”,但是命令到底什么时候执行呢?在多大程度上保证命令将被安全执行,例如两次执行之间不会经过最大给定时间?

地位:

$ systemctl status mintupdate-automation-upgrade.timer
● mintupdate-automation-upgrade.timer - Update Manager automatic upgrades
     Loaded: loaded (/lib/systemd/system/mintupdate-automation-upgrade.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Fri 2021-01-22 20:20:24 CET; 4 days ago
    Trigger: Thu 2021-01-28 00:44:21 CET; 12h left
   Triggers: ● mintupdate-automation-upgrade.service

配置文件

$ systemctl cat mintupdate-automation-upgrade.*
# /lib/systemd/system/mintupdate-automation-upgrade.timer
[Unit]
Description=Update Manager automatic upgrades

[Timer]
OnCalendar=daily
OnStartupSec=60m
RandomizedDelaySec=60m
Persistent=true

[Install]
WantedBy=timers.target

# /lib/systemd/system/mintupdate-automation-upgrade.service
[Unit]
Description=Update Manager automatic upgrades
After=network-online.target

[Service]
Type=oneshot
CPUQuota=50%
CPUWeight=20
IOWeight=20
ExecStart=/usr/lib/linuxmint/mintUpdate/automatic_upgrades.py

[Install]
WantedBy=multi-user.target

定时器有Persistent标志,但服务(由定时器触发)没有

$ systemctl show mintupdate-automation-upgrade.timer --property=Persistent
Persistent=yes

答案1

Persistent=仅适用于定时器(参见man systemd.timer)。这就是为什么你看不到它

systemctl show mintupdate-automation-upgrade.service --property=Persistent

当我们查看计时器时,它会显示:

[Timer]
OnCalendar=daily
OnStartupSec=60m
RandomizedDelaySec=60m
Persistent=true
  • OnCalendar=daily:使用日历事件表达式定义实时(即挂钟)计时器daily。这实际上意味着它将在每晚午夜运行。
  • Persistent=true:表示“服务单元最后一次被触发的时间存储在磁盘上。当计时器被激活时,如果在计时器未激活期间至少被触发一次,则服务单元将立即被触发。这样的触发是尽管如此,仍会受到 RandomizedDelaySec= 造成的延迟的影响,这对于在系统断电时追赶错过的服务运行很有用。”
  • OnStartupSec=60m定义一个相对于服务管理器首次启动时间的计时器。
  • RandomizedDelaySec=60m将计时器延迟 0 到 60m 之间随机选择、均匀分布的时间量。每个计时器单元将在每次迭代之前随机确定该延迟,并且该延迟将简单地添加到下一个确定的经过时间之上。此设置可用于在一定时间间隔内延长类似配置的计时器事件的调度,以防止它们同时触发,从而可能导致资源拥塞。

因此,如果您让机器过夜,它会在午夜到 01:00 之间触发。如果您重新启动计算机,它将在启动后 1 到 2 小时内触发。如果您将计算机关闭过夜,那么早上它将在启动后 1 小时内触发(对于OnCalendar/Persistent触发器),然后在启动后 1 到 2 小时内再次触发(对于OnStartupSec触发器)。

我怀疑您最担心的是在 23 点启动机器时的情况。在这种情况下,它将在 00:00 和 01:00 之间触发两次。当触发器触发时,如果服务oneshot仍处于运行activating时的状态,则触发器将被忽略。ExecStart=因此,同一个服务不会有两个并发触发器,因此它是安全的。

但随后您询问两次执行之间的最短时间。我们通常尽量不用“时间”来保证事情的安全。这类似于添加sleepbash 脚本,当我们懒得监听适当的信号时,这通常是一种解决方法 ( ./foo & sleep 5 && ./bar)。它也是不稳定的工作,因为不能保证时间到期时事情实际上已经准备好。如果这个脚本写得好,它应该连续执行几次,而不需要任何时间分隔它(./foo && ./foo && ./foo),所以你不必担心安全性。

答案2

它似乎不去工作,当计算机关闭或没有互联网连接时,它不会跟上,因为消息仍然显示:

$ systemctl --no-pager status mintupdate-automation-upgrade.timer
...
Trigger: Tue 2021-02-02 00:32:40 CET; 13h left

所以更新过程(至少使用这种方法,也许与 相比unattended-upgrades)是不太安全

如果有可能修复它,请告诉我?

相关内容