继续 systemd 教程,这些特殊的例子可以展示给你如何更好的利用 systemd 定时器单元。
在这个 systemd 系列教程中,我们已经在某种程度上讨论了 systemd 定时器单元。不过,在我们开始讨论 sockets 之前,我们先来看三个例子,这些例子展示了如何最佳化利用这些单元。
简单的类 cron 行为
我每周都要去收集 Debian popcon 数据,如果每次都能在同一时间收集更好,这样我就能看到某些应用程序的下载趋势。这是一个可以使用 cron 任务来完成的典型事例,但 systemd 定时器同样能做到:
# 类 cron 的 popcon.timer -
[Unit] Description= 这里描述了下载并处理 popcon 数据的时刻 -
[Timer] OnCalendar= Thu *-*-* 05:32:07 Unit= popcon.service -
[Install] WantedBy= basic.target
实际的 popcon.service 会执行一个常规的 wget 任务,并没有什么特别之处。这里的新内容是 OnCalendar= 指令。这个指令可以让你在一个特定日期的特定时刻来运行某个服务。在这个例子中,Thu 表示 “在周四运行”,*-*-* 表示“具体年份、月份和日期无关紧要”,这些可以翻译成 “不管年月日,只在每周四运行”。
这样,你就设置了这个服务的运行时间。我选择在欧洲中部夏令时区的上午 5:30 左右运行,那个时候服务器不是很忙。
如果你的服务器关闭了,而且刚好错过了每周的截止时间,你还可以在同一个计时器中使用像 anacron 一样的功能。
# 具备类似 anacron 功能的 popcon.timer -
[Unit] Description= 这里描述了下载并处理 popcon 数据的时刻 -
[Timer] Unit=popcon.service OnCalendar=Thu *-*-* 05:32:07 Persistent=true -
[Install] WantedBy=basic.target
当你将 Persistent= 指令设为真值时,它会告诉 systemd,如果服务器在本该它运行的时候关闭了,那么在启动后就要立刻运行服务。这意味着,如果机器在周四凌晨停机了(比如说维护),一旦它再次启动后,popcon.service 将会立刻执行。在这之后,它的运行时间将会回到例行性的每周四早上 5:32.
到目前为止,就是这么简单直白。
延迟执行
但是,我们提升一个档次,来“改进”这个基于 systemd 的监控系统。你应该记得,当你接入摄像头的时候,系统就会开始拍照。假设你并不希望它在你安装摄像头的时候拍下你的脸。你希望将拍照服务的启动时间向后推迟一两分钟,这样你就有时间接入摄像头,然后走到画框外面。
为了完成这件事,首先你要更改 Udev 规则,将它指向一个定时器:
ACTION=="add", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="e207", TAG+="systemd", ENV{SYSTEMD_WANTS}="picchanged.timer", SYMLINK+="mywebcam", MODE="0666"
这个定时器看起来像这样:
# picchanged.timer -
[Unit] Description= 在摄像头接入的一分钟后,开始运行 picchanged -
[Timer] OnActiveSec= 1 m Unit= picchanged.path -
[Install] WantedBy= basic.target
在你接入摄像头后,Udev 规则被触发,它会调用定时器。这个定时器启动后会等上一分钟(OnActiveSec= 1 m ),然后运行 picchanged.path ,它会监视主图片的变化。picchanged.path 还会负责接触 webcan.service ,这个实际用来拍照的服务。
在每天的特定时刻启停 Minetest 服务器
在最后一个例子中,我们认为你决定用 systemd 作为唯一的依赖。讲真,不管怎么样,systemd 差不多要接管你的生活了。为什么不拥抱这个必然性呢?
你有个为你的孩子设置的 Minetest 服务。不过,你还想要假装关心一下他们的教育和成长,要让他们做作业和家务活。所以你要确保 Minetest 只在每天晚上的一段时间内可用,比如五点到七点。
这个跟之前的“在特定时间启动服务”不太一样。写个定时器在下午五点启动服务很简单…:
# minetest.timer -
[Unit] Description= 在每天下午五点运行 minetest.service -
[Timer] OnCalendar= *-*-* 17:00:00 Unit= minetest.service -
[Install] WantedBy= basic.target
…可是编写一个对应的定时器,让它在特定时刻关闭服务,则需要更大剂量的横向思维。
(编辑:ASP站长网)
|