即使在 persist=false 的情况下,systemd 计时器每个周期也会运行多次

即使在 persist=false 的情况下,systemd 计时器每个周期也会运行多次

我有一个设备,通常我想运行,但有时我想手动关闭它,然后自动重新启动。所以我有一个计时器来重新启动它OnCalendar=daily。这可行,但有时我需要停止设备两次,因为计时器立即重新启动设备。

这是一个简化的示例,其中只用了几分钟而不是几天:

[Unit]
Description=foo timer

[Timer]
Persistent=false
OnCalendar=minutely
AccuracySec=1
Unit=foo.service

[Install]
WantedBy=default.target

[Unit]
Description=foo service

[Service]
Type=simple
ExecStart=/bin/sh -c 'while true; do sleep 1; done'

[Install]
WantedBy=default.target

如果 I systemctl stop foo.service,并且计时器已在 1 分钟前触发(在 中超过 1m systemdctl list-timers),它会立即重新触发并启动设备。如果我停止两次,设备总是保持停止状态直到下一分钟。该文档听起来Persistent=false不应该导致这种情况,但显然我误解了。如果重要的话,我真正感兴趣的日常单位是系统单位,但测试单位是用户单位;行为是一样的。

答案1

Persistent=false(即默认)保持禁用捕获系统关闭期间错过的计时器的功能。在您的情况下,系统处于在线状态并且计时器被省略 - 如果OnCalendar时间段已经过去(可能是因为 foo.service 已经在运行),它仍然等待运行“一分钟/天”的时刻上次运行后“ - 不是最后一次尝试/检查/尝试运行后,这恰好意味着停止 foo.service 后立即

这是引用的结果man systemd.timer请注意,如果要激活的单元在计时器结束时已经处于活动状态,则不会重新启动,而只是继续运行。目前,如果计时器已过,但由于服务仍在运行而跳过了该操作,我看不到重置计时器的直接方法。

间接方法是自重启定时器,类似 foo-try_restart.service systemctl restart foo-try_restart.timer之前调用试图systemctl start foo.service.由于您的与新创建的(带,不带)foo.service不同,它总是会触发,因此它的计时器会在每个周期后重置。foo-try_restart.serviceType=oneshotRemainAfterExitfoo-try_restart.timer

相关内容