学习使用systemd创建计时器以启动游戏服务器。之前,我们了解了如何在启动和关闭时、启用设备时以及进行文件系统更改时手动启用和禁用systemd服务。计时器添加了另一种启动服务的方式,基于...时间。尽管类似于cron作业,但systemd计时器稍微灵活一些。让我们看看它是如何工作的。“在计时器上运行”让我们扩展您在本系列前两篇文章中设置的Minetest服务器,作为如何使用计时器单元的第一个示例。如果您还没有阅读过这些文章,现在就可以查看它们。您将通过创建一个在服务器启动后1分钟而不是立即运行游戏服务器的计时器来“改进”Minetest服务器。这样做的原因可能是在开始之前可能使用了其他服务,比如给其他玩家发邮件告诉他们游戏已经准备好了,你要确保其他服务(比如网络)在开始之前已经完全正常运行。最终,你的minetest.timer单元看起来像这样:一点都不难。与往常一样,它以[Unit]和一条描述该单元功能的消息开头,这里没有什么新内容。[Timer]部分是新的,但其用途不言自明:它包含有关何时启动服务以及启动哪个服务的信息。在此示例中,OnBootSec是一个指示systemd在系统启动后运行该服务的指令。其他指令是:OnActiveSec=,它告诉systemd在计时器启动后要运行服务多长时间。OnStartupSec=,再一次,它告诉systemd在systemd进程启动后要运行该服务多长时间。OnUnitActiveSec=,告诉systemd在上次由计时器激活的服务启动服务后要运行该服务多长时间。OnUnitInactiveSec=,告诉systemd在最后一次定时器激活的服务停用后运行服务多长时间。继续minetest.timer单元,basic.target通常用作延迟启动服务的同步点。这意味着可以在安装本地挂载点或交换设备、套接字、计时器、路径单元和其他基本初始化过程后运行minetest.timer单元。正如在第二篇文章的systemd单元中解释的那样,目标就像旧的运行级别,它可以让你的计算机进入某种状态,或者告诉你的服务达到某种状态后开始运行。您在前两篇文章中配置的minetest.service文件最终看起来像这样:/usr/games/minetest--serverExecStartPost=/home//bin/mtsendmail.sh“准备好了吗?”“Minetest正在启动”TimeoutStopSec=180ExecStop=/home//bin/mtsendmail.sh“去睡觉吧。睡衣之夜!”"MinetestStoppingin2minutes"ExecStop=/bin/sleep120ExecStop=/bin/kill-2$MAINPID[Install]WantedBy=multi-user.target此处无需更改。但是您需要从以下位置安装mtsendmail.sh(发送电子邮件的脚本):#!/bin/bash#mtsendmailsleep20echo$1|mutt-F/home/
