定时器增加了另一种启动服务的方式,基于……时间。尽管与定时任务很相似,但 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
一点也不难吧。
如以往一般,开头是 [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
文件最终看起来就像这样:
# 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 的脚本)从:
#!/bin/bash# mtsendmailsleep 20echo $1 | mutt -F /home/<username>/.muttrc -s "$2" my_minetest@mailing_list.comsleep 10
改成:
代码语言:javascript复制#!/bin/bash# mtsendmail.shecho $1 | mutt -F /home/paul/.muttrc -s "$2" pbrown@mykolab.com
你做的事是去除掉 Bash 脚本中那些蹩脚的停顿。Systemd 现在来做等待。
让它运行起来
确保一切运作正常,禁用 minetest.service
:
sudo systemctl disable minetest
这使得系统启动时它不会一同启动;然后,相反地,启用 minetest.timer
:
sudo systemctl enable minetest.timer
现在你就可以重启服务器了,当运行 sudo journalctl -u minetest.*
后,你就会看到 minetest.timer
单元执行后大约一分钟,minetest.service
单元开始运行。