Systemd 中的 timer 单元

上一篇讲了 systemd 中的 service 单元,这次记录一下 timer 单元。timer 必须依赖 service 单元来配置,可以用来做替代 crontab 的选择。

timer 单元以.timer结尾,中间包含[Timer]块如下面所示是 Ubuntu 下的apt-daily.timer,该目录下也存在一个apt-daily.service服务文件配合一起使用。

[Unit]
Description=Daily apt activities

[Timer]
OnCalendar=*-*-* 6,18:00
RandomizedDelaySec=12h
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target

上面的[Timer]块代表每天上午 6 点和下午 6 点都运行 apt 脚本,具体[Timer]块可配置以下参数

单调定时器(Monotonic timer)

Option Description
OnActiveSec= 相对计时器开始后多少时间执行,格式如 2h、2s、2w、2d
OnBootSec= 相对系统启动后多少时间执行
OnStartupSec= 相对 systemd 启动多少时间后执行
OnUnitActiveSec= 每隔多少时间再次运行一次
OnUnitInactiveSec= 服务在最后一次停止后,隔多久再执行一次

可以两个参数一起使用,如下每周开机 15 分钟后执行 foo

[Unit]
Description=Run foo weekly and on boot

[Timer]
OnBootSec=15min
OnUnitActiveSec=1w

[Install]
WantedBy=timers.target

实时定时器(Realtime timer)

Option Description
OnCalendar= 相对系统时间指定特定时刻运行,它接受如 2h、2s 的格式也可以是 星期 年-月-日 时:分:秒的格式,..指定区间,*代表所有的。可参考 systemd.time(7)
Persistent= 是一个布尔值,默认为 no,当使用 OnCalendar 的设置时,指定该功能要不要持续进行。如断电恢复后是不是要执行上次没执行的
AccuracySec= 设置定时器的触发精度。默认值是一分钟。定时器并不必然在所设置的精准时间点上启动匹配单元, 而是在所设置的精准时间点为起点的一小段时间窗口范围内的某个时间点上启动匹配单元, 这个时间窗口的起点由 OnCalendar=, OnActiveSec=, OnBootSec=, OnStartupSec=, OnUnitActiveSec= or OnUnitInactiveSec= 决定, 而这个时间窗口的长度则由该指令决定。
RandomizedDelaySec= 将此单元的定时器随机延迟一小段时间, 这一小段时间的长度介于零到该指令设置的时间长度之间, 以均匀概率分布。

如下是每月的 1 到 4 号 12 点周一和周二运行 foo,格式如OnCalendar=*-*-* 4:00:00代表每天 4 点

[Unit]
Description=Run foo weekly

[Timer]
OnCalendar=Mon,Tue *-*-01..04 12:00:00
Persistent=true

[Install]
WantedBy=timers.target

所有timer单元可以像service一样使用systemctl status|enable|disable name.timer查看信息,可以使用systemctl list-timers列出运行中的 timer,加--all参数列出包含未激活的。

ubuntu➜  ~  ᐅ  sudo systemctl list-timers --all
NEXT                         LEFT     LAST                         PASSED       UNIT                         ACTIVATES
Thu 2018-08-16 06:52:42 CST  7h left  Wed 2018-08-15 06:22:54 CST  17h ago      apt-daily-upgrade.timer      apt-daily-upgrade.service
Thu 2018-08-16 09:48:35 CST  10h left Wed 2018-08-15 20:15:54 CST  3h 10min ago apt-daily.timer              apt-daily.service
Thu 2018-08-16 21:34:50 CST  22h left Wed 2018-08-15 21:34:50 CST  1h 51min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
n/a                          n/a      n/a                          n/a          snapd.refresh.timer
n/a                          n/a      n/a                          n/a          snapd.snap-repair.timer      snapd.snap-repair.service
n/a                          n/a      n/a                          n/a          ureadahead-stop.timer        ureadahead-stop.service

6 timers listed.