当前位置: 首页 > Linux

systemd定时服务的使用方法

时间:2023-04-06 01:36:44 Linux

我上篇介绍的locate文件搜索命令需要依赖updatedb更新索引来快速查找文件,所以需要定时运行该命令来更新文件索引。我们知道,crontab通常用于在Linux和类Unix系统上创建定时任务。我们在Ubuntu上使用aptinstallmlocate后,会安装一个脚本文件到/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是我在上一篇文章使用SYSTEMCTL管理OPENSUSE上的系统服务中介绍过的一个Linux系统服务管理程序。这里我们重点介绍Systemd的定时服务(systemdtimerunit)。systemd计时单元类似于Cron。systemd计时单元提供了一种在Linux系统上调度任务的机制。其他的相比Cron机制有如下特点(在使用systemd作为初始化和服务管理的系统上):定时任务可以依赖其他systemd服务,可以使用systemctl命令来管理计时单元,类似于管理系统服务。除了类似Cron的循环实时定时任务(realtime),它还支持一个基于非时间事件触发的任务(monotonic)定时单元记录。记录到systemd的日志系统(journal),方便统一监控诊断systemd定时任务的类型。在上面的特性中,我们提到它支持两种类型——realtime和monotonicRealtime——类似于Cron,这类定时任务由定义的绝对时间触发,在配置文件中通过OnCalendar选项来定义Monotonic——这类定时任务会在指定事件(如系统启动、服务激活)的一定时间后触发,在配置文件中通过OnBootSec和OnUnitActiveSec、OnStartupSec等选项来定义,此类定时任务的触发时间不固定,它会在每次系统重启后重置。一看,有个文件/usr/lib/systemd/system/mlocate.timer,没错,就是通过扩展名为.timer的systemd单位文件来定义systemd的计时单位[Unit]Description=DailylocatedatabaseupdateDocumentation=man:updatedb[Timer]OnCalendar=dailyAccuracySec=12hUnit=mlocate.servicePersistent=true[Install]WantedBy=timers.target可以看到文件格式类似于systemd服务的unit文件,但是需要[Timer]部分,在该部分定义了下面的选项OnCalendar=daily,表示每天触发AccuracySec=12h,也就是说由于某些原因,需要推测执行时间。Unit=mlocate.service,这里是指定需要执行的任务服务Persistent=true,指定如果因为关机等原因任务可以执行,启动会立即触发任务,那么计时单元指定mlocate.service为触发执行任务,也就是定义在/usr/lib/systemd/system/mlocate.service中的service,在service中定义了使用updatedb命令来更新文件索引。对于OnCalendar,其值支持的格式为DayOfWeekYear-Month-DayHour:Minute:Second,如OnCalendar=--*5:00:00,指定执行OnCalendar=Fri18:00:00,指定执行at6:00pmonFridayofeverymonthFriday22:00在一个配置文件中,也可以指定多个OnCalendar,比如OnCalendar=Mon..Fri10:00OnCalendar=Sat,Sun22:00以上配置指定了每个月的上午10:00周一至周五全天,周末两晚10点执行。让我们以使用单调定时任务为例。/etc/systemd/system/目录下的服务单元文件foo.service[Unit]Description="Fooshellscript"[Service]ExecStart=/usr/local/bin/foo.sh创建一个计时单元文件foo.timer[Unit]Description="Runfooshellscript"[Timer]OnBootSec=5minOnUnitActiveSec=24hUnit=foo.service[Install]WantedBy=multi-user.target这里我们看到在[Timer]部分,我们定义了选项OnBootSec=5min,指定系统启动5分钟后触发指定服务的执行。但是执行时间取决于启动时间)Unit=foo.service,指定触发的任务是我们上面定义的foo服务,即执行foo.sh脚本来管理定时器单元的上述特性,我们说定时器单元可以通过systemctl命令进行管理,类似于管理服务单元sudosystemctlstartfoo.timer,启动指定的定时单元sudosystemctlenablefoo.timer,开启定时单元的自动激活(开机自动启动)sudosystemctllist-timers,列出当前激活的系统例如,sudosystemctllist-timersNEXTLEFTLASTPASSEDUNITACTIVATESFri2021-12-0317:00:00CST22minleftFri2021-12-0316:00:03CST37分钟前snapper-timeline.timersnapper-timeline.serviceSat2021-12-0400:00:00CST7h左周五2021-12-0300:00:03CST16小时前logrotate.timerlogrotate.serviceSat2021-12-0400:00:00CST7h离开星期五2021-12-0300:00:03CST16小时前.timermlocate.service我们也可以直接使用journalctl查看相关日志,例如?sudojournalctl-umlocate--LogsbeginatThu2021-12-0206:58:59CST,endatFri2021-12-0316:41:26CST。--Dec0300:00:03linux-devsystemd[1]:StartingUpdatelocatedatabase...Dec0300:00:03linux-devsu[864]:(对任何人)rootonnoneDec0300:00:06linux-devsystemd[1]:开始更新定位数据库。同时查看mlocate计时单元和服务日志。更多配置细节,可以参考官方文档。总结如果你的系统使用Systemd作为初始化和服务管理系统,并且想使用我们之前提到的功能,那么我们可以使用systemd的定时器单元来定义我们的定时任务。当然,大部分系统还是支持Crontab机制的定时任务的。也发布在Mengz的博客上