Linux基础服务 Linux基础知识 ·

systemd之timers.target

[隐藏]

有时候,某些服务你想要定期执行,或者是开机后执行,或者是什么服务启动多久后执行等等的。在过去,我们基本都是使用 crond 这个服务来定期处理。

不过,现在有一直常驻在内存当中的 systemd ,提供名为 timers.target 的服务,来协助定期处理各种任务!那么,除了 crond 之外,我们来学习一下如何使用 systemd 内建的 time 来处理各种任务!

systemd.timer 的优劣势

systemd.timer 的优势:

  • 由于所有的 systemd 的服务产生的信息都会被纪录(log),因此比 crond 在 debug 上面要更清楚方便的多;
  • 各项 timer 的工作可以跟 systemd 的服务相结合;
  • 各项 timer 的工作可以跟 control group (cgroup,用来取代 /etc/secure/limit.conf 的功能) 结合,来限制该工作的资源利用。
  • systemd 可以到秒甚至是毫秒的单位。

systemd.timer 的劣势:

  • systemd 的 timer 并没有email 通知的功能。
  • 没有类似 anacron 的一段时间内的随机取样功能(random_delay)。

启用条件

想要使用 systemd 的 timer 功能,你必须满足几个条件件:

  • 系统的 timer.target 一定要启动
  • 要有个 sname.service 的服务存在( sname 是你自己指定的名称)
  • 要有个 sname.timer 的时间启动服务存在

满足上面的需求就OK 了!

sname.timer 的设定值

我们可以到/etc/systemd/system 底下去建立这个 *.timer 文件,这个文件内容的重要项目基本设定主要有底下这些:

(man systemd.timer & man systemd.time)

[Timer] 部份
设定参数参数意义说明
OnActiveSec当 timers.target 启动多久之后才执行这只unit
OnBootSec当开机完成后多久之后才执行
OnStartupSec当 systemd 第一次启动之后过多久才执行
OnUnitActiveSec这个 timer 配置文件所管理的那个 unit 服务在最后一次启动后,隔多久后再执行一次的意思
OnUnitInactiveSec这个 timer 配置文件所管理的那个unit 服务在最后一次停止后,隔多久再执行一次的意思。
OnCalendar使用实际时间(非循环时间) 的方式来启动服务的意思!
Unit一般来说不需要设定,因此如同上面刚刚提到的,基本上我们设定都是 sname.server + sname.timer,那如果你的 sname 并不相同时,那在 .timer 的文件中, 就得要指定是哪一个 service unit !
Persistent当使用 OnCalendar 的设定时,指定该功能要不要持续进行的意思。通常是设定为yes ,能够满足类似 anacron 的功能!

基本的项目仅有这些!

使用于OnCalendar 的时间

如果要从 crontab 转成这个 timer 功能的话,那么对于时间设定的格式就得要了解了解~基本上的格式如下所示:

语法:英文周名YYYY-MM-DD HH:MM:SS
范例:Thu 2015-08-13 13:40:00

上面的是基本的语法,我们也可以直接使用间隔时间来处理!常用的间隔时间单位有:

  • us 或 usec:微秒(10 -6秒)
  • ms 或 msec:毫秒(10 -3秒)
  • s, sec, second, seconds
  • m, min, minute, minutes
  • h, hr, hour, hours
  • d, day, days
  • w, week, weeks
  • month, months
  • y, year, years

常见的使用范例有:

隔3 小时: 3h 或3hr 或3hours

隔300 分钟过10 秒: 10s 300m

隔5 天又100 分钟: 100m 5day
# 通常英文的写法,小单位写前面,大单位写后面~所以先秒、再分、再小时、再天数等~

此外,我们也可以使用英文常用的口语化日期代表,例如 today, tomorrow 等!假设今天是2015-08-13 13:50:00 的话,那么:

英文口语实际的时间格式代表
nowThu 2015-08-13 13:50:00
todayThu 2015-08-13 00:00:00
tomorrowThu 2015-08-14 00:00:00
hourly*-*-* *:00:00
daily*-*-* 00:00:00
weeklyMon *-*-* 00:00:00
monthly*-*-01 00:00:00
+3h10mThu 2015-08-13 17:00:00
2015-08-16Sun 2015-08-16 00:00:00

范例:

  • 开机后2 小时开始执行一次这个backup.service
  • 自从第一次执行后,未来我每两天要执行一次backup.service

如上表所示,我上次执行 backup.service 的时间是在 2015-08-13 14:50 ,由于设定两个小时执行一次,因此下次应该是 2015-08-15 14:50 执行!由于 timer 是由 timers.target 这个 unit 所管理的,而这个 timers.target 的启动时间是在 2015-08-13 14:31 , 要注意,最终 backup.timer 所纪录的下次执行时间,其实是与 timers.target 所纪录的时间差!因此是『 2015-08-15 14:50 - 2015-08-13 14:31 』才对!所以时间差就是 2d 19min !


范例:星期天凌晨2 点运行如上的备份程序

与循环时间运作差异比较大的地方,在于这个 OnCalendar 的方法对照的时间并不是 times.target 的启动时间,而是 Unix 标准时间!亦即是 1970-01-01 00:00:00 去比较的!因此,当你看到最后出现的 NextElapseUSecRealtime 时,下一次执行还要【45 年+ 7 个月+ 1 周+ 6 天+ 10 小时过30 分】比对的是『日历时间』,而不是某个 unit 的启动时间。

通过这样的方式,就可以使用 systemd 的 timer 来规划定时服务了!

 

参与评论