Hero Image
SYSTEMD定时服务

我上一篇文章中介绍的locate文件查找命令,需要依赖updatedb更新索引才能快速查找文件,因此需要定时运行该命令来更新文件索引。我们知道在Linux和类Unix系统上通常使用crontab来创建定时任务。 在Ubuntu上我们使用apt install mlocate之后,会安装一个脚本文件到 /etc/cron.daily/mlocate,也就是通过Cron机制来每天执行updatedb。然而在我的openSUSE上却并未发现有相关的Crontab配置,但我发现索引文件还是在每天的零点进行了更新,那这个定时任务是谁来执行的呢? 我通过查找与mlocate相关的文件,发现了以下几个文件: ❯ locate "mlocate" /etc/systemd/system/timers.target.wants/mlocate.timer /usr/lib/systemd/system/mlocate.service /usr/lib/systemd/system/mlocate.timer 原来在openSUSE系统上,使用的是Systemd的定时单元来实现的。Systemd是一种Linux系统服务管理程序,在我之前的文章在OPENSUSE上使用SYSTEMCTL管理系统服务中介绍过。 那这里我们将重点介绍下Systemd的定时服务(systemd timer unit)。 systemd定时单元 类似与Cron,systemd的定时单元在Linux系统上提供了机制来调度任务,相比于Cron机制,其他具有以下特性(在使用systemd作为初始化和服务管理的系统上): 调度的任务可以依赖于其他systemd服务 可以使用systemctl命令来管理定时单元,类似与管理systemd服务 除了类似Cron的循环实时定时任务(realtime)之外,还支持一种基于非时间事件触发的任务(monotonic) 定时单元记录日志到systemd的日志系统(journal),因此方便于统一监控和诊断 systemd定时任务的类型 上面的特性中,我们提到其支持两种类型 - realtime 和 monotonic Realtime - 类似于Cron,这种类型的定时任务由定义的绝对时间来触发,在配置文件中通过 OnCalendar 选项来定义 Monotonic - 这种类型的定时任务将会在指定的事件(例如系统启动,服务激活)一定时间后触发,在配置文件中通过 OnBootSec 和 OnUnitActiveSec ,OnStartupSec 等选项来定义,并且该类型的定时任务触发时间不是固定的,在每一次系统重启之后都会被重置 systemd定时任务的配置 在文章开始,我们在寻找mlocate更新文件索引的定时任务时看到,有文件 /usr/lib/systemd/system/mlocate.timer ,没错,就是通过以 .timer 作为扩展名的systemd单元文件来定义systemd的定时单元的 [Unit] Description=Daily locate database update Documentation=man:updatedb [Timer] OnCalendar=daily AccuracySec=12h Unit=mlocate.service Persistent=true [Install] WantedBy=timers.target 可以看到文件格式与systemd服务的单元文件类似,不过需要 [Timer] 段,在该段定义了如下选项 OnCalendar=daily,意思是每天触发 AccuracySec=12h,意思是由于某些原因需要推测执行的时间 Unit=mlocate.service,这里就是指定了需要执行的任务服务 Persistent=true,指定如果由于关机等原因到时了为能执行任务的情况下,启动会立即触发该任务 那该定时单元指定了 mlocate.service 作为触发执行的任务,也就是 /usr/lib/systemd/system/mlocate.