学习使用 systemd 创建启动你的游戏 服务器 的定时器。
之前,我们看到了如何手动的、在开机与关机时、在启用某个设备时、在文件系统发生改变时 启用与禁用 systemd 服务。
定时器增加了另一种启动服务的方式,基于……时间。尽管与定时任务很相似,但 systemd 定时器稍微地灵活一些。让我们看看它是怎么工作的。
“定时运行”
让我们展开本系列前两篇文章中你所设置的 Minetest 服务器作为如何使用定时器单元的第一个例子。如果你还没有读过那几篇文章,可以现在去看看。
你将通过创建一个定时器来“改进” Minetest 服务器,使得在服务器启动 1 分钟后运行游戏服务器而不是立即运行。这样做的原因可能是,在启动之前可能会用到其他的服务,例如发邮件给其他玩家告诉他们游戏已经准备就绪,你要确保其他的服务(例如网络)在开始前完全启动并运行。
最终,你的
minetest.timer
单元看起来就像这样:
# minetest.timer[Unit]Description=Runs the minetest.service 1 minute after boot up[Timer]OnBootSec=1 mUnit=minetest.service[Install]WantedBy=basic.target
一点也不难吧。
如以往一般,开头是和一段描述单元作用的信息,这儿没什么新东西。这一节是新出现的,但它的作用不言自明:它包含了何时启动服务,启动哪个服务的信息。在这个例子当中,是告诉 systemd 在系统启动后运行服务的指令。
其他的指令有:
继续
minetest.timer
单元,
basic.target
通常用作后期引导服务late boot services的同步点synchronization point。这就意味着它可以让
minetest.timer
单元运行在安装完本地挂载点local mount points或交换设备,套接字、定时器、路径单元和其他基本的初始化进程之后。就像在第二篇文章中 systemd 单元里解释的那样,就像旧的运行等级old run levels一样,可以将你的计算机置于某个状态,或像这样告诉你的服务在达到某个状态后开始运行。
在前两篇文章中你配置的
minetest.service
文件最终看起来就像这样:
# minetest.service[Unit]Description= Minetest serverDocumentation=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 的脚本)从:
#!/bin/bash# mtsendmailsleep 20echo $1 | mutt -F /home/
/.muttrc -s "$2" my_minetest@mailing_list.comsleep 10
改成:
#!/bin/bash# mtsendmail.shecho $1 | mutt -F /home/paul/.muttrc -s "$2" [emailprotected]
你做的事是去除掉 Bash 脚本中那些蹩脚的停顿。Systemd 现在来做等待。
让它运行起来
确保一切运作正常,禁用
minetest.service
:
sudo systemctl disable minetest
这使得系统启动时它不会一同启动;然后,相反地,启用
minetest.timer
:
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=
指令修改误差幅度。
你也可以检查系统上所有的定时器何时运行或是上次运行的时间:
systemctl list-timers --all
图 2:检查定时器何时运行或上次运行的时间
最后一件值得思考的事就是你应该用怎样的格式去表示一段时间。Systemd 在这方面非常灵活:,或都可以用来表示 2 个小时。对于“秒”,你可以用,,和。“分”也是同样的方式:,,和。你可以检查
man systemd.time
来查看 systemd 能够理解的所有时间单元。
下一次
回头见!
在 Linux 基金会和 edx 上通过免费课程 “Introduction to Linux” 学习更多关于 Linux 的知识。
linux 脚本编程 定时关闭和打开程序
1、利用crontab 制定定时任务2、编写定时关闭和打开程序的脚本或命令3、crontab的用法第1列分钟1~59第2列小时1~23(0表示子夜)第3列日1~31第4列月1~12第5列星期0~6(0表示星期天)第6列要运行的命令下面是crontab的格式:分 时 日 月 星期要运行的命令或脚本30 21 * * * /usr/local/apache/bin/apachectl restart上面的例子表示每晚的21:30重启apache
如何更新linux系统时间
方法/步骤修改系统时间。 linux系统时钟有两个,一个是硬件时钟,即BIOS时间,就是我们进行CMOS设置时看到的时间,另一个是系统时钟,是linux系统Kernel时间。 当Linux启动时,系统Kernel会去读取硬件时钟的设置,然后系统时钟就会独立于硬件运作。 有时我们会发现系统时钟和硬件时钟不一致,因此需要执行时间同步,下面就分享一下时间设置及时钟同步的命令使用方法。 date命令将日期设置为2014年6月18日 ---- date -s 06/18/14将时间设置为14点20分50秒 ---- date -s 14:20:50将时间设置为2014年6月18日14点16分30秒()----date .30 hwclock/clock 命令查看、设置硬件时间查看系统硬件时钟hwclock--show 或者clock--show设置硬件时间 hwclock --Set --date=06/18/14 14:55 (月/日/年时:分:秒)或者# clock --set --date=06/18/14 14:55 (月/日/年时:分:秒) 同步系统及硬件时钟。 下图中可以看到硬件和系统时钟相差半小时。 可以使用hwclock或者clock进行同步,硬件时钟与系统时钟同步:# hwclock --hctosys 或者 # clock --hctosyshc代表硬件时间,sys代表系统时间,即用硬件时钟同步系统时钟系统时钟和硬件时钟同步:# hwclock --systohc或者# clock --systohc即用系统时钟同步硬件时钟
怎样查看Linux下systemd启动了哪些服务,先后顺序如何?
您可以通过pstree命令查看启动了哪些服务,使用systemd-analyse plot > 生成一张启动详细信息矢量图,然后用图像浏览器或者网页浏览器打开查看
发表评论