加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

Systemd定时器:三种使用场景

发布时间:2018-12-15 19:43:54 所属栏目:Windows 来源:Paul Brown
导读:继续 systemd 教程,这些特殊的例子可以展示给你如何更好的利用 systemd 定时器单元。 在这个 systemd 系列教程中,我们已经在某种程度上讨论了 systemd 定时器单元。不过,在我们开始讨论 sockets 之前,我们先来看三个例子,这些例子展示了如何最佳化利
副标题[/!--empirenews.page--]

/uploads/allimg/c181203/1543SZ51Z430-149E.jpg

继续 systemd 教程,这些特殊的例子可以展示给你如何更好的利用 systemd 定时器单元。

在这个 systemd 系列教程中,我们已经在某种程度上讨论了 systemd 定时器单元。不过,在我们开始讨论 sockets 之前,我们先来看三个例子,这些例子展示了如何最佳化利用这些单元。

简单的类 cron 行为

我每周都要去收集 Debian popcon 数据,如果每次都能在同一时间收集更好,这样我就能看到某些应用程序的下载趋势。这是一个可以使用 cron 任务来完成的典型事例,但 systemd 定时器同样能做到:

  1. # 类 cron 的 popcon.timer
  2.  
  3. [Unit]
  4. Description= 这里描述了下载并处理 popcon 数据的时刻
  5.  
  6. [Timer]
  7. OnCalendar= Thu *-*-* 05:32:07
  8. Unit= popcon.service
  9.  
  10. [Install]
  11. WantedBy= basic.target

实际的 popcon.service 会执行一个常规的 wget 任务,并没有什么特别之处。这里的新内容是 OnCalendar= 指令。这个指令可以让你在一个特定日期的特定时刻来运行某个服务。在这个例子中,Thu 表示 “在周四运行”,*-*-* 表示“具体年份、月份和日期无关紧要”,这些可以翻译成 “不管年月日,只在每周四运行”。

这样,你就设置了这个服务的运行时间。我选择在欧洲中部夏令时区的上午 5:30 左右运行,那个时候服务器不是很忙。

如果你的服务器关闭了,而且刚好错过了每周的截止时间,你还可以在同一个计时器中使用像 anacron 一样的功能。

  1. # 具备类似 anacron 功能的 popcon.timer
  2.  
  3. [Unit]
  4. Description= 这里描述了下载并处理 popcon 数据的时刻
  5.  
  6. [Timer]
  7. Unit=popcon.service
  8. OnCalendar=Thu *-*-* 05:32:07
  9. Persistent=true
  10.  
  11. [Install]
  12. WantedBy=basic.target

当你将 Persistent= 指令设为真值时,它会告诉 systemd,如果服务器在本该它运行的时候关闭了,那么在启动后就要立刻运行服务。这意味着,如果机器在周四凌晨停机了(比如说维护),一旦它再次启动后,popcon.service 将会立刻执行。在这之后,它的运行时间将会回到例行性的每周四早上 5:32.

到目前为止,就是这么简单直白。

延迟执行

但是,我们提升一个档次,来“改进”这个基于 systemd 的监控系统。你应该记得,当你接入摄像头的时候,系统就会开始拍照。假设你并不希望它在你安装摄像头的时候拍下你的脸。你希望将拍照服务的启动时间向后推迟一两分钟,这样你就有时间接入摄像头,然后走到画框外面。

为了完成这件事,首先你要更改 Udev 规则,将它指向一个定时器:

  1. ACTION=="add", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="03f0",
  2. ATTRS{idProduct}=="e207", TAG+="systemd", ENV{SYSTEMD_WANTS}="picchanged.timer",
  3. SYMLINK+="mywebcam", MODE="0666"

这个定时器看起来像这样:

  1. # picchanged.timer
  2.  
  3. [Unit]
  4. Description= 在摄像头接入的一分钟后,开始运行 picchanged
  5.  
  6. [Timer]
  7. OnActiveSec= 1 m
  8. Unit= picchanged.path
  9.  
  10. [Install]
  11. WantedBy= basic.target

在你接入摄像头后,Udev 规则被触发,它会调用定时器。这个定时器启动后会等上一分钟(OnActiveSec= 1 m),然后运行 picchanged.path,它会监视主图片的变化。picchanged.path 还会负责接触 webcan.service,这个实际用来拍照的服务。

在每天的特定时刻启停 Minetest 服务器

在最后一个例子中,我们认为你决定用 systemd 作为唯一的依赖。讲真,不管怎么样,systemd 差不多要接管你的生活了。为什么不拥抱这个必然性呢?

你有个为你的孩子设置的 Minetest 服务。不过,你还想要假装关心一下他们的教育和成长,要让他们做作业和家务活。所以你要确保 Minetest 只在每天晚上的一段时间内可用,比如五点到七点。

这个跟之前的“在特定时间启动服务”不太一样。写个定时器在下午五点启动服务很简单…:

  1. # minetest.timer
  2.  
  3. [Unit]
  4. Description= 在每天下午五点运行 minetest.service
  5.  
  6. [Timer]
  7. OnCalendar= *-*-* 17:00:00
  8. Unit= minetest.service
  9.  
  10. [Install]
  11. WantedBy= basic.target

…可是编写一个对应的定时器,让它在特定时刻关闭服务,则需要更大剂量的横向思维。

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读