我有一个设备,通常我想运行,但有时我想手动关闭它,然后自动重新启动。所以我有一个计时器来重新启动它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.service
Type=oneshot
RemainAfterExit
foo-try_restart.timer