文章摘要: 本文主要描述了systemd服务timer类的应用。

[Timer]

设定参数参数意义说明
OnActiveSec当 timers.target 启动多久之后开始执行
OnBootSec当开机完成后多久之后才执行
OnStartupSec当systemd第一次启动之后过多久才执行
OnUnitActiveSec配置文件所管理的那个服务在最后一次启动后,隔多久再执行一次
OnUnitInactiveSec配置文件所管理的那个服务在最后一次停止后,隔多久再执行一次。
OnCalendar使用实际时间 (非循环时间) 的方式来启动服务。
Persistent当使用 OnCalendar 的设定时,指定该功能要不要持续进行,通常是设定为 yes,类似于anacron的功能
Unitservice与timer的名称相同时,一般不需要设置,如果名称不相同时(比如多个timer对应同一个service时,需要通过Unit项指定service

示例: 开机后2小时开始执行一次,然后每两天要执行一次

# /etc/systemd/system/backup.timer


[Unit]
Description=backup timer test

[Timer]
# 开机后执行延时,单位为秒,可采用hrs,days来指定单位
OnBootSec=2hrs
# 定时时间
OnUnitActiveSec=2days
# timer与service名称一致时,不需要指定Unit项

[Install]
WantedBy=multi-user.target
# systemctl daemon-reload 
# systemctl enable backup.timer 
Created symlink from /etc/systemd/system/multi-user.target.wants/backup.timer to /etc/systemd/system/backup.timer.
# systemctl restart backup.timer 
# systemctl list-unit-files | grep 'backup'
backup.service    disabled #个不需要启动!只要 enable backup.timer 即可!
backup.timer      enabled 

显示 timer 服务启动的时间:

# systemctl show time
ConditionTimestamp=五 2019-11-08 07:42:28 CST   

显示 backup.service 上次执行的时间:

# systemctl show backup.service
ExecMainExitTimestamp=五 2019-11-08 07:52:28 CST    

下一次执行距离 timers.target 的时间

# systemctl show backup.timer 
NextElapseUSecMonotonic=2d 19min 11.540653s   
 

由于 timer 是由 timers.target 这个 unit 所管理的,backup.timer 所纪录的下次运行时间,其实是与 timers.target 所纪录的时间差。


一个固定日期运作示例: 每周日2点整执行

# /etc/systemd/system/backup2.timer 
[Unit]
Description=backup server timer test2
    
[Timer]
OnCalendar=Sun *-*-* 02:00:00
Persistent=true
# 当定时任务与执行任务名称不一致时,需要指明service
Unit=backup.service

[Install]
WantedBy=multi-user.target
# systemctl daemon-reload 
# systemctl enable backup2.timer 
# systemctl start backup2.timer    
# systemctl show backup2.timer 
NextElapseUSecRealtime=50y 8month 5d 8h 

下次执行时间:
50y = 1970 + 50 = 2020(从1970年开始算)
8month = 9月(从0开始算)
5d = 6日
8h = 08:00:00
8h 2min 30s = 08:02:30