Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在 Linux 上使用 systemd 设置定时器

在 Linux 上使用 systemd 设置定时器

原创
作者头像
用户8989785
修改于 2021-09-10 09:37:13
修改于 2021-09-10 09:37:13
1.8K00
代码可运行
举报
文章被收录于专栏:网站技术分享网站技术分享
运行总次数:0
代码可运行

定时器增加了另一种启动服务的方式,基于……时间。尽管与定时任务很相似,但 systemd 定时器稍微地灵活一些。让我们看看它是怎么工作的。

“定时运行”

让我们展开本系列前两篇文章中你所设置的 Minetest 服务器作为如何使用定时器单元的第一个例子。如果你还没有读过那几篇文章,可以现在去看看。

你将通过创建一个定时器来“改进” Minetest 服务器,使得在服务器启动 1 分钟后运行游戏服务器而不是立即运行。这样做的原因可能是,在启动之前可能会用到其他的服务,例如发邮件给其他玩家告诉他们游戏已经准备就绪,你要确保其他的服务(例如网络)在开始前完全启动并运行。

最终,你的 minetest.timer 单元看起来就像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# minetest.timer[Unit]Description=Runs the minetest.service 1 minute after boot up[Timer]OnBootSec=1 mUnit=minetest.service[Install]WantedBy=basic.target

一点也不难吧。

如以往一般,开头是 [Unit] 和一段描述单元作用的信息,这儿没什么新东西。[Timer] 这一节是新出现的,但它的作用不言自明:它包含了何时启动服务,启动哪个服务的信息。在这个例子当中,OnBootSec 是告诉 systemd 在系统启动后运行服务的指令。

其他的指令有:

  • OnActiveSec=,告诉 systemd 在定时器启动后多长时间运行服务。
  • OnStartupSec=,同样的,它告诉 systemd 在 systemd 进程启动后多长时间运行服务。
  • OnUnitActiveSec=,告诉 systemd 在上次由定时器激活的服务启动后多长时间运行服务。
  • OnUnitInactiveSec=,告诉 systemd 在上次由定时器激活的服务停用后多长时间运行服务。

继续 minetest.timer 单元,basic.target 通常用作后期引导服务late boot services的同步点synchronization point。这就意味着它可以让 minetest.timer 单元运行在安装完本地挂载点local mount points或交换设备,套接字、定时器、路径单元和其他基本的初始化进程之后。就像在第二篇文章中 systemd 单元里解释的那样,targets 就像旧的运行等级old run levels一样,可以将你的计算机置于某个状态,或像这样告诉你的服务在达到某个状态后开始运行。

在前两篇文章中你配置的 minetest.service 文件最终看起来就像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# minetest.service[Unit]Description= Minetest serverDocumentation= https://wiki.minetest.net/Main_Page[Service]Type= simpleUser=ExecStart= /usr/games/minetest --serverExecStartPost= /home//bin/mtsendmail.sh "Ready to rumble?" "Minetest Starting up"TimeoutStopSec= 180ExecStop= /home//bin/mtsendmail.sh "Off to bed. Nightie night!" "Minetest Stopping in 2 minutes"ExecStop= /bin/sleep 120ExecStop= /bin/kill -2 $MAINPID[Install]WantedBy= multi-user.target

这儿没什么需要修改的。但是你需要将 mtsendmail.sh(发送你的 email 的脚本)从:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash# mtsendmailsleep 20echo $1 | mutt -F /home/<username>/.muttrc -s "$2" my_minetest@mailing_list.comsleep 10

改成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash# mtsendmail.shecho $1 | mutt -F /home/paul/.muttrc -s "$2" pbrown@mykolab.com

你做的事是去除掉 Bash 脚本中那些蹩脚的停顿。Systemd 现在来做等待。

让它运行起来

确保一切运作正常,禁用 minetest.service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo systemctl disable minetest

这使得系统启动时它不会一同启动;然后,相反地,启用 minetest.timer

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo systemctl enable minetest.timer

现在你就可以重启服务器了,当运行 sudo journalctl -u minetest.* 后,你就会看到 minetest.timer 单元执行后大约一分钟,minetest.service 单元开始运行。

📷

图 1:minetest.timer 运行大约 1 分钟后 minetest.service 开始运行

时间的问题

minetest.timer 在 systemd 的日志里显示的启动时间为 09:08:33 而 minetest.service 启动时间是 09:09:18,它们之间少于 1 分钟,关于这件事有几点需要说明一下:首先,请记住我们说过 OnBootSec= 指令是从引导完成后开始计算服务启动的时间。当 minetest.timer 的时间到来时,引导已经在几秒之前完成了。

另一件事情是 systemd 给自己设置了一个误差幅度margin of error(默认是 1 分钟)来运行东西。这有助于在多个资源密集型进程resource-intensive processes同时运行时分配负载:通过分配 1 分钟的时间,systemd 可以等待某些进程关闭。这也意味着 minetest.service 会在引导完成后的 1~2 分钟之间启动。但精确的时间谁也不知道。

顺便一提,你可以用 AccuracySec= 指令修改误差幅度。

你也可以检查系统上所有的定时器何时运行或是上次运行的时间:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
systemctl list-timers --all
📷

图 2:检查定时器何时运行或上次运行的时间

最后一件值得思考的事就是你应该用怎样的格式去表示一段时间。Systemd 在这方面非常灵活:2 h2 hours2hr 都可以用来表示 2 个小时。对于“秒”,你可以用 secondssecondsecs。“分”也是同样的方式:minutesminuteminm。你可以检查 man systemd.time 来查看 systemd 能够理解的所有时间单元。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Systemd 定时器教程
Systemd 作为 Linux 的系统启动器,功能强大。 本文通过一个简单例子,介绍 Systemd 如何设置定时任务。这不仅实用,而且可以作为 Systemd 的上手教程。 一、定时任务 所谓定时
ruanyf
2018/04/12
1.2K0
Systemd 定时器教程
Linux systemd 定时器 timer
用来取代 crontab systemd 系列文章请查看:https://www.khs1994.com/tags/systemd/ 要使用定时器必须编写两个文件: name.timer 配置时间。 name.service 配置具体执行的命令。 注意:这两个文件的名称是相同的,只是后缀不同。 编写脚本 /usr/local/bin/name.sh #!/bin/bash date >> /tmp/name.txt echo 1 >> /tmp/name.txt 在 /etc/systemd/s
康怀帅
2018/02/28
7.9K0
关于Linux中作业调度 crond 和 systemd.timer 使用场景的一些笔记
crond 这里不多介绍,小伙伴们应该都接触过。所以直接来看 systemd.timer
山河已无恙
2023/01/30
9620
服务器开机启动,你还在用rc-local吗?大神都用服务(service)机制
在最新版本的 systemd 中,已经不再推荐使用 rc-local 来运行自定义脚本或命令。相反,建议使用 systemd 的单位(unit)和服务(service)机制来管理和运行自定义脚本或命令。
用户10002156
2024/01/29
9210
服务器开机启动,你还在用rc-local吗?大神都用服务(service)机制
Linux项目开发,你必须了解Systemd服务!
Systemd是什么,以前linux系统启动init机制,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能对服务本身进行更多的管理。Systemd就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案,根据Linux惯例,字母d是守护进程(daemon)的缩写,Systemd这个名字的含义,就是它要守护整个系统。使用了Systemd,就不需要再用init了。Systemd取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。
武汉万象奥科
2024/06/18
1800
Linux项目开发,你必须了解Systemd服务!
systemd 编写服务管理脚本
我们运行 Linux 服务器的主要目的是通过运行程序提供服务,比如 MySQL、web server等。因此管理 Linux 服务器主要工作就是配置并管理上面运行的各种服务程序。在 Linux 系统中服务程序的管理主要由 init 系统负责。如同笔者在《初识 systemd》一文中的介绍,Linux 的 init 系统已经从最初的 sysvinit 进化到了如今的 systemd。本文主要介绍在 systemd 环境中如何编写运行服务的配置文件。
星哥玩云
2022/07/13
1.4K0
systemd 编写服务管理脚本
性能工具之Jmeter常用定时器
作用:通过ThreadDelay设定每个线程请求之前的等待时间(单位为毫秒)。
高楼Zee
2019/12/12
1.4K0
性能工具之Jmeter常用定时器
最简明扼要的 Systemd 教程,只需十分钟
Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。
双面人
2020/02/13
2.5K0
学会爱上 systemd
systemd(是的,全小写,即使在句子开头也是小写),是初始化程序(init)和 SystemV 初始化脚本的现代替代者。此外,它还有更多功能。
用户8639654
2021/09/18
1.2K0
linux基础命令介绍十四:定时任务
在计算机的使用过程中,经常会有一些计划中的任务需要在将来的某个时间执行,linux中提供了一些方法来设定定时任务。
用户5030870
2019/04/11
1.4K0
[Linux]systemd定时任务
书接上回,话说这个PrimeNote在我的笔记本上开机启动很正常,可是找了一台配置较低的台式机出现启动后找不到任务栏图标的情况。估计是台式机启动太慢,导致PrimeNote启动完成了系统的图形环境初始化还没有完成。
用户9314062
2022/05/20
1.4K0
JMeter定时器设置延迟与同步
用的比较少,比Constant Throughput Timer更复杂更高级的用来控制吞吐量的一个定时器。
dongfanger
2021/06/17
2.3K0
JMeter定时器设置延迟与同步
systemd服务管理详解与子命令一览
描述:系统启动和服务器守护进程管理器,负责在系统启动或运行时激活系统资源,并且管理服务器进程和其它进程,可以说他是Linux的小伙伴系统启动时候最先都是运行的systemd;
全栈工程师修炼指南
2022/09/28
2.1K0
systemd服务管理详解与子命令一览
Systemd 从入门到实战
Systemd (System Daemon),根据 Linux 命名惯例,字母 d 是守护进程 daemon 的缩写。如 Systemd 名字的含义一样,它作为 PID 1 进程,守护整个系统。Systemd 是一系列工具的集合,其作用也远远不仅是启动操作系统,它还接管了后台服务、结束、状态查询,以及日志归档、设备管理、电源管理、定时任务等许多职责。
Yorkyu
2022/03/22
1.4K0
Systemd 从入门到实战
WorkMan手册笔记-定时器类
一、定时执行某个函数或者类方法 int \Workerman\Lib\Timer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true]) 参数 time_interval 多长时间执行一次,单位秒,支持小数,可以精确到0.001,即精确到毫秒级别。 callback 回调函数注意:如果回调函数是类的方法,则方法必须是public属性 args 回调函数的参数,必须为数组,数组元素为参
苦咖啡
2018/04/28
1.4K0
Linux设置定时重启
因为有对服务器进行每天定时重启的需求,但是我不会操作,在百度和谷歌上难以找到这方面的文章,找到的文章写的方法也是临摹两可,所以就写了这篇文章分享我摸索出来的方法
曈曈too
2023/02/27
25.3K1
systemd 使用教程【转】
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
保持热爱奔赴山海
2019/09/18
1.1K0
systemd 使用教程【转】
Linux systemd 详解
目前几乎所有的 Linux 发行版已切换到 systemd。 GitHub:https://github.com/systemd/systemd 官方网站:https://www.freedesktop.org/wiki/Software/systemd/ systemd 系列文章请查看:https://www.khs1994.com/tags/systemd/ 拼写 systemd 均为小写,其他任何写法都不正确。 命令 systemctl start stop restart kill reload
康怀帅
2018/02/28
4.2K0
Systemd 入门教程:实战篇
上一篇文章,我介绍了 Systemd 的主要命令,今天介绍如何使用它完成一些基本的任务。 一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/sy
ruanyf
2018/04/13
1K0
Systemd 入门教程:实战篇
Systemd管理服务
Systemd 是一系列工具的集合,其作用也远远不仅是启动操作系统,它还接管了后台服务、结束、状态查询,以及日志归档、设备管理、电源管理、定时任务等许多职责,并支持通过特定事件(如插入特定 USB 设备)和特定端口数据触发的 On-demand(按需)任务。
mikelLam
2022/08/15
7010
相关推荐
Systemd 定时器教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验