systemd.time - OnCalendar= 挂起后不需要运行

systemd.time - OnCalendar= 挂起后不需要运行

我想要一个“更愚蠢”版本的 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

答案2

当您使用时,您不需要在暂停/恢复时停用和重新激活Persistent=true
因为这就是该指令的全部思想,它将信息存储在磁盘上以供重复使用。

所以也许您面临的问题是由于使用了horcrux-sleep.servicesystemd 计时器而不需要的。

RandomizedDelaySec=您也许应该使用检查计时器单元的值systemctl show来查看它是否具有非零值,在这种情况下您可以将其设置为0。加上、和
的值OnClockChange=OnTimezoneChange=RemainAfterElapse=

(参见man systemd.timer这些指令的解释)

答案3

经过多次测试,也Persistent=boolean没有完成任务。到目前为止,我完全忘记了/etc/crontab,所有的时间都用来crontab -e解决 anachron 的问题,这导致了你在上面看到的 systemd 配置,因此根本就没有这个线程。

但是添加工作来/etc/crontab完成工作时不会出现错误 - 不会“赶上”。

相关内容