关于linux:如何使用Systemd定时服务

70次阅读

共计 3495 个字符,预计需要花费 9 分钟才能阅读完成。

我上一篇文章中介绍的 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 – 这种类型的定时工作将会在指定的事件(例如系统启动,服务激活)肯定工夫后触发,在配置文件中通过 OnBootSecOnUnitActiveSecOnStartupSec 等选项来定义,并且该类型的定时工作触发工夫不是固定的,在每一次零碎重启之后都会被重置

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.service 里定义的服务,那服务里就是定义应用 updatedb 命令去更新文件索引。

对于 OnCalendar,其值反对的格局为 DayOfWeek Year-Month-Day Hour:Minute:Second,例如

  • OnCalendar=-* 5:00:00,指定在每天早上的 5 点执行
  • OnCalendar=Fri 18:00:00,指定在每个月的周五下午 6 点执行

在一个配置文件中,还能够指定多个 OnCalendar,例如

OnCalendar=Mon..Fri 10:00
OnCalendar=Sat,Sun 22:00

下面的配置就指定了在周一到周五的每天上午 10 点,以及在周末两天的早晨 10 点执行。

上面咱们来举一个应用 monotonic 类型定时工作的例子,在目录 /etc/systemd/system/ 下服务单元文件 foo.service

[Unit]
Description="Foo shell script"

[Service]
ExecStart=/usr/local/bin/foo.sh

同时创立一个定时单元文件 foo.timer

[Unit]
Description="Run foo shell script"

[Timer]
OnBootSec=5min
OnUnitActiveSec=24h
Unit=foo.service

[Install]
WantedBy=multi-user.target

这里咱们看到在 [Timer] 段,咱们定义一下选项

  • OnBootSec=5min,指定了在系统启动 5 分钟后触发指定服务的执行
  • OnUnitActiveSec=24h,指定了在服务在激活之后的 24 小时执行,也就是每天都会执行一次(然而执行的具体工夫取决于开机工夫)
  • Unit=foo.service,指定了触发的工作是咱们下面定义的 foo 服务,也就是执行 foo.sh 脚本

治理 timer 单元

下面的个性中,咱们说道 timer 单元能够通过 systemctl 命令进行治理,相似治理服务单元

  • sudo systemctl start foo.timer,启动指定的定时单元
  • sudo systemctl enable foo.timer,开启定时单元主动激活(开机自启)
  • sudo systemctl list-timers,列出以后零碎已激活的定时单元

例如

❯ sudo systemctl list-timers
NEXT                         LEFT                LAST                         PASSED      UNIT                         ACTIVATES
Fri 2021-12-03 17:00:00 CST  22min left          Fri 2021-12-03 16:00:03 CST  37min ago   snapper-timeline.timer       snapper-timeline.service
Sat 2021-12-04 00:00:00 CST  7h left             Fri 2021-12-03 00:00:03 CST  16h ago     logrotate.timer              logrotate.service
Sat 2021-12-04 00:00:00 CST  7h left             Fri 2021-12-03 00:00:03 CST  16h ago     mandb.timer                  mandb.service
Sat 2021-12-04 00:00:00 CST  7h left             Fri 2021-12-03 00:00:03 CST  16h ago     mlocate.timer                mlocate.service

咱们还能够间接应用 journalctl 来查看相干日志,例如

❯ sudo journalctl -u mlocate
-- Logs begin at Thu 2021-12-02 06:58:59 CST, end at Fri 2021-12-03 16:41:26 CST. --
Dec 03 00:00:03 linux-dev systemd[1]: Starting Update locate database...
Dec 03 00:00:03 linux-dev su[864]: (to nobody) root on none
Dec 03 00:00:06 linux-dev systemd[1]: Started Update locate database.

同时查看 mlocate 定时单元和服务的日志。

对于更多的配置细节,能够参考官网文档。

总结

如果你的零碎应用的 Systemd 作为初始化和服务管理系统,并且想应用到咱们之前提到的个性,那么咱们能够应用 systemd 的 timer 单元来定义咱们的定时工作。当然大部分零碎还是反对 Crontab 机制的定时工作。

同时公布在 Mengz’s Blog

正文完
 0