我想要一个“更愚蠢”版本的 crontab:只在给定的时间运行,暂停后不追赶。即当一个服务应该由 crontab 触发时,但是机器被挂起,它在恢复后立即被触发。这就是我不想要的。
我通过编写一个 systemd.timer 单元(而不是 crontab)和相应的 -sleep.service 来解决这个问题,当机器要挂起时,它会停用计时器单元,并在系统恢复时重新激活计时器单元。自从我上周末的最后一次更新以来,它的行为突然像 crontab 那样:计时器单元在计时器单元启动时启动了它的目标,即使它不是计时器单元内的给定时间。
我检查了日志,-sleep.service 单元完成了它的工作并停用了计时器单元。 (计时器单元也显示其已停用和重新激活。)但是,正如我所说:我不希望计时器单元“赶上”。我希望它只在给定的时间触发它的单位,而不是其他!
非常感谢!
问候多姆
# horcrux-sleep.service
[Unit]
Description=horcrux sleep hook
Before=sleep.target
Before=shutdown.target
StopWhenUnneeded=yes
RefuseManualStart=yes
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/systemctl stop horcrux.timer
ExecStop=/usr/bin/systemctl start horcrux.timer
[Install]
WantedBy=sleep.target
Also=horcrux.timer
# horcrux.timer
Jun 27 06:51:15 citadel systemd[1]: Stopped Schedule for backup.
[Unit]
Description=Schedule
[Timer]
OnCalendar=Mon *-*-* 20..21:00:00
OnCalendar=Tue..Thu *-*-* 17..21:00:00
OnCalendar=Fri *-*-* 17..23:00:00
OnCalendar=Sat *-*-* *:00:00
OnCalendar=Sun *-*-* 00..21:00:00
## Spätschicht
#OnCalendar=Mon..Wed,Fri *-*-* 7..11:00:00
## Frühschicht am Donnerstag
#OnCalendar=Thu *-*-* 13..16:00:00
## Frühschicht täglich
#OnCalendar=Mon..Fri *-*-* 7..11:00:00
## freie Tage
#OnCalendar=Mon..Fri 9..11,14..16,0..5:00:00
## Urlaub / Krankheit
#OnCalendar=*-*-* *:00:00
Persistent=1
AccuracySec=1sec
[Install]
WantedBy=timers.target
Also=horcrux-sleep.service
答案1
也许是持续的干扰。 https://www.freedesktop.org/software/systemd/man/systemd.timer.html#Persistent=
设置持久= false
答案2
当您使用时,您不需要在暂停/恢复时停用和重新激活Persistent=true
。
因为这就是该指令的全部思想,它将信息存储在磁盘上以供重复使用。
所以也许您面临的问题是由于使用了horcrux-sleep.service
systemd 计时器而不需要的。
RandomizedDelaySec=
您也许应该使用检查计时器单元的值systemctl show
来查看它是否具有非零值,在这种情况下您可以将其设置为0
。加上、和
的值OnClockChange=
OnTimezoneChange=
RemainAfterElapse=
(参见man systemd.timer
这些指令的解释)
答案3
经过多次测试,也Persistent=boolean
没有完成任务。到目前为止,我完全忘记了/etc/crontab
,所有的时间都用来crontab -e
解决 anachron 的问题,这导致了你在上面看到的 systemd 配置,因此根本就没有这个线程。
但是添加工作来/etc/crontab
完成工作时不会出现错误 - 不会“赶上”。