[转帖]在 Linux 上使用 systemd 设置定时器

在 Linux 上使用 systemd 设置定时器

https://linux.cn/article-10182-1.html

作者: Paul Brown 译者: LCTT LuMing

| 2018-11-01 22:13   收藏: 1 分享: 3

学习使用 systemd 创建启动你的游戏服务器的定时器。

之前,我们看到了如何手动的在开机与关机时在启用某个设备时在文件系统发生改变时 启用与禁用 systemd 服务。

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

“定时运行”

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

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

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

  1. # minetest.timer
  2. [Unit]
  3. Description=Runs the minetest.service 1 minute after boot up
  4. [Timer]
  5. OnBootSec=1 m
  6. Unit=minetest.service
  7. [Install]
  8. 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 文件最终看起来就像这样:

  1. # minetest.service
  2. [Unit]
  3. Description= Minetest server
  4. Documentation= https://wiki.minetest.net/Main_Page
  5. [Service]
  6. Type= simple
  7. User=
  8. ExecStart= /usr/games/minetest --server
  9. ExecStartPost= /home//bin/mtsendmail.sh "Ready to rumble?" "Minetest Starting up"
  10. TimeoutStopSec= 180
  11. ExecStop= /home//bin/mtsendmail.sh "Off to bed. Nightie night!" "Minetest Stopping in 2 minutes"
  12. ExecStop= /bin/sleep 120
  13. ExecStop= /bin/kill -2 $MAINPID
  14. [Install]
  15. WantedBy= multi-user.target

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

  1. #!/bin/bash
  2. # mtsendmail
  3. sleep 20
  4. echo $1 | mutt -F /home/<username>/.muttrc -s "$2" [email protected]_list.com
  5. sleep 10

改成:

  1. #!/bin/bash
  2. # mtsendmail.sh
  3. echo $1 | mutt -F /home/paul/.muttrc -s "$2" [email protected].com

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

让它运行起来

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

  1. sudo systemctl disable minetest

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

  1. 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= 指令修改误差幅度

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

  1. systemctl list-timers --all

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

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

下一次

下次你会看到如何使用日历中的日期和时间来定期运行服务,以及如何通过组合定时器与设备单元在插入某些硬件时运行服务。

回头见!

在 Linux 基金会和 edx 上通过免费课程 “Introduction to Linux” 学习更多关于 Linux 的知识。

原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/12092652.html

时间: 2024-10-29 21:16:35

[转帖]在 Linux 上使用 systemd 设置定时器的相关文章

Linux上MongoDB一些设置

MongoDB启动停止方法 官网安装介绍中依然有启动停止的方式 1 启动 sudo service mongod start 2 停止 sudo service mongod stop 3 重启 sudo service mongod restart 4 查看状态 sudo service mongod status 或者查看进程 ps -ef | grep mongod 或者查看端口号状态 netstat -lanp | grep 27017 5 连接 mongo 6 查看数据库配置 less

Linux 上安装 Mysql 设置root密码问题

Ubuntu 18.10.1 Mysql 5.7.26-0 1. 安装mysql apt-get install mysql-server 安装完可以直接使用,但是新版本在安装过程中没有提示设置root用户密码,使用如下方法设置: sudo mysql_secure_installation 过程中提示是否开启 VALIDATE PASSWORD PLUGIN,就是设置密码强度检查,自行选择: VALIDATE PASSWORD PLUGIN can be used to test passwo

linux上如何设置ssh免密登陆

一.linux上ssh链接 1.功能说明 scp就是security copy,用于将文件或者目录从一个Linux系统拷贝到另一个Linux系统下.scp传输数据用的是SSH协议,保证了数据传输的安全,其格式如下: scp 远程用户名@IP地址:文件的绝对路径 本地Linux系统路径 scp 本地Linux系统文件路径 远程用户名@IP地址:远程系统文件绝对路径名 scp使用第一种格式是将远程Linux系统上的某个文件或者目录拷贝到本地Linux系统上来,使用第二种是将本地的某个文件或者目录拷贝

在Linux上使用环境变量配置SQL Server设置

你可以使用不同的环境变量在Linux上配置SQL Server 2017.这些变量用于两个场景: 使用mssql-conf setup命令配置初始化设置. 配置一个新的Docker容器中的SQL Server. 环境变量 环境变量 描述 ACCEPT_EULA 在设置为任何值(例如"Y")时接受 SQL Server 许可协议. MSSQL_SA_PASSWORD 配置 SA 用户密码. MSSQL_PID 设置 SQL Server 版本或产品密钥. 可能的值包括:Evaluatio

[转帖]Linux 上网络监控工具 ntopng 的安装

Linux 上网络监控工具 ntopng 的安装 https://linux.cn/article-5664-1.html 作者: Pungki Arianto 译者: LCTT joeren | 2015-06-21 08:53   评论: 9 收藏: 10 当今世界,人们的计算机都相互连接,互联互通.小到你的家庭局域网(LAN),大到最大的一个被我们称为互联网.当你管理一台联网的计算机时,你就是在管理最关键的组件之一.由于大多数开发出的应用程序都基于网络,网络就连接起了这些关键点. 这就是为

Linux上的ftp服务器vsftpd之配置满天飞--设置匿名用户访问(不弹出用户名密码框)以及其他用户可正常上传

一.问题背景 没事谁折腾这鬼玩意哦...还不是因为bug. 我们的应用,用户头像是存在ftp上的.之前的ftp服务器是一台windows,我们后台服务器程序收到用户上传头像的请求时,会用一个ROOT/ROOT的账户,连接ftp服务器. 获取到连接后,即进行上传. 上传:上传文件则存放在ROOT用户的home 目录(在windows上装的是server-U来充当ftp服务器,所以就是在Server-U里面配置了ROOT用户的home目录). 上传完成后,会得到一个ftp协议类型的url.范例如:

[转帖]如何在Linux上使用命令行查看硬件信息

如何在Linux上使用命令行查看硬件信息 时间:2016-01-13   作者:admin 分类:新手入门 阅读:126次 http://embeddedlinux.org.cn/emb-linux/entry-level/201601/13-4889.html lscpu 原来更简单.. 在 Linux 中,可用于检查和查看硬件信息的命令有很多.其中某些命令可以输出特定硬件和信息,例如:CPU 和内存等.本教程列出一些 Linux 上查看硬件信息的常用命令,以帮助大家快速输出硬件的配置细节.

[转帖]JProfiler远程监控Linux上Tomcat的安装过程细讲(步骤非常详细!!!)

JProfiler远程监控Linux上Tomcat的安装过程细讲(步骤非常详细!!!) https://www.cnblogs.com/yjd_hycf_space/p/7727757.html 原文地址:https://www.cnblogs.com/jinanxiaolaohu/p/12115262.html

【无私分享:ASP.NET CORE 项目实战(第十章)】发布项目到 Linux 上运行 Core 项目

目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 ASP.Net Core 给我们带来的最大的亮点就是跨平台,我在我电脑(win7)上用虚拟机建了个 CentOS7 ,来演示下,我们windows上的项目如何发布项目到Linux上运行.我这里有个在windows上搭建过的程序,我们主要演示如何在linux上运行,所以大家不要纠结于这些,大家可以新建一个web项目尝试一下. 安装.NET Core SDK for CentOS 微软有详细的安装命令,可以参考Install