如何使用 systemd 中的定时器

如何使用 systemd 中的定时器

我最近在写一些执行备份工作的脚本,我决定使用systemd timers而不是对我而已更熟悉的cron jobs来管理它们。

在我使用时,出现了很多问题需要我去各个地方找资料,这个过程非常麻烦。因此,我想要把我目前所做的记录下来,方便自己的记忆,也方便读者不必像我这样,满世界的找资料了。

在我下面提到的步骤中有其他的选择,但是这里是最简单的方法。在此之前,请查看systemd.service,systemd.timer,和systemd.target的帮助页面(man),学习你能用它们做些什么。

运行一个简单的脚本

假设你有一个脚本叫:/usr/local/bin/myscript ,你想要每隔一小时就运行一次。

Service 文件

第一步,创建一个service文件,根据你Linux的发行版本放到相应的系统目录(在Arch中,这个目录是/etc/systemd/system/ 或 /usr/lib/systemd/system)

myscript.service


  1. [Unit]
  2. Description=MyScript
  3.  
  4. [Service]
  5. Type=simple
  6. ExecStart=/usr/local/bin/myscript

注意,务必将Type变量的值设置为"simple"而不是"oneshot"。使用"oneshot"使得脚本只在第一次运行,之后系统会认为你不想再次运行它,从而关掉我们接下去创建的定时器(Timer)。

Timer 文件

第二步,创建一个timer文件,把它放在第一步中service文件放置的目录。

myscript.timer


  1. [Unit]
  2. Description=Runs myscript every hour
  3.  
  4. [Timer]
  5. # 首次运行要在启动后10分钟后
  6. OnBootSec=10min
  7. # 每次运行间隔时间
  8. OnUnitActiveSec=1h
  9. Unit=myscript.service
  10.  
  11. [Install]
  12. WantedBy=multi-user.target

授权 / 运行

授权并运行的是timer文件,而不是service文件。


  1. # 以 root 身份启动定时器
  2. systemctl start myscript.timer
  3. # 在系统引导起来后就启用该定时器
  4. systemctl enable myscript.timer

在同一个Timer上运行多个脚本

现在我们假设你在相同时间想要运行多个脚本。这种情况,你需要在上面的文件中做适当的修改。

Service 文件

像我之前说过的那样创建你的service文件来运行你的脚本,但是在每个service 文件最后都要包含下面的内容:


  1. [Install]
  2. WantedBy=mytimer.target

如果在你的service 文件中有一些依赖顺序,确保你使用Description字段中的值具体指定After=something.service和Before=whatever.service中的参数。

另外的一种选择是(或许更加简单),创建一个包装脚本来使用正确的顺序来运行命令,并在你的service文件中使用这个脚本。

Timer 文件

你只需要一个timer文件,创建mytimer.timer,像我在上面指出的

target 文件

你可以创建一个以上所有的脚本依赖的target文件。

mytimer.target


  1. [Unit]
  2. Description=Mytimer
  3. # Lots more stuff could go here, but it's situational.
  4. # Look at systemd.unit man page.

授权 / 启动

你需要将所有的service文件和timer文件授权。


  1. systemctl enable script1.service
  2. systemctl enable script2.service
  3. ...
  4. systemctl enable mytimer.timer
  5. systemctl start mytimer.service

Good luck.

原文发布时间:2014-10-12

本文来自云栖合作伙伴“linux中国”

时间: 2024-10-22 04:34:16

如何使用 systemd 中的定时器的相关文章

matlab gui中使用定时器出错

问题描述 matlab gui中使用定时器出错 计算计时器 'timer-74' 的 TimerFcn 时出错 对象无效或已删除. 计算计时器 'timer-75' 的 TimerFcn 时出错 输入参数的数目不足 或者 计算计时器 'timer-98' 的 TimerFcn 时出错 对象无效或已删除. 计算计时器 'timer-99' 的 TimerFcn 时出错 H 必须是图形或图形子级的句柄. 我是这样编写的 定时器中,'TimerFcn',{@TimerFcn,handles} 回调函数

VC++实现非窗口类中使用定时器的方法

定时器在Windows 的程序中的作用不可忽略,也随处可见.设定一个时间间隔每0.5秒或者1秒钟刷新一次时钟,这样就可以完成一个简单的电子钟程序.在不同的编程工具中定时器的用法也不同,Visual C++中也给我们提供了实现这种功能的方法,而且方法不只一种.在窗口类中是使用定时器比较很简单,用SetTimer()设置了定时器之后,并在Class Wizard中添加了WM_TIMER消息映射后,您就可以在映射函数OnTimer()中添加代码实现,来定时完成您的任务,而且还支持任意多个定时器,这种方

非窗口类中使用定时器的方法及相关知识的介绍

本文代码运行效果图如下: 摘 要:本文主要通过一些简单的例子,介绍了如何在Visual C++的窗口和非窗口类中使用定时器.重点介绍了如何用静态成员函数和静态数据成员在非窗口类中使用定时器,同时,又介绍了与定时器相关的知识,例如回调函数,C++类中的静态成员,以及模板类中的映射类等. 关键字 C++ 类 定时器 静态函数 静态成员函数 静态数据成员 回调函数 映射类 摘 要:This page introduce how to use timer in window class and none

浅谈Node.js中的定时器

  本文给大家分享的是Node.js中的定时器的相关资料,十分的全面细致,有需要的小伙伴可以参考下. Node.js中定时器的实现 上一篇博文提到,在Node中timer并不是通过新开线程来实现的,而是直接在event loop中完成.下面通过几个JavaScript的定时器示例以及Node相关源码来分析在Node中,timer功能到底是怎么实现的. JavaScript中定时器功能的特点 无论是Node还是浏览器中,都有setTimeout和setInterval这两个定时器函数,并且其工作特

基于Android中实现定时器的3种解决方法_Android

在Android开发中,定时器一般有以下3种实现方法:一.采用Handler与线程的sleep(long)方法二.采用Handler的postDelayed(Runnable, long)方法三.采用Handler与timer及TimerTask结合的方法下面逐一介绍:一.采用Handle与线程的sleep(long)方法Handler主要用来处理接受到的消息.这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释.1. 定义一个Handler类,用

mysql中的定时器打开问题

问题描述 mysql中的定时器打开问题 在我关掉mysql服务之后,里面的定时器会同时停止,再打开之后定时器会不会启动? 解决方案 启动服务后,会自动启动定时器. 解决方案二: 但是我用SHOW VARIABLES LIKE 'event_scheduler';查出来的是"OFF",是不是得设置什么呀 解决方案三: mysql定时器MySQL定时器mysql 定时器

让你提前认识软件开发(21):C程序中的定时器

第1部分 重新认识C语言 C程序中的定时器   [文章摘要]         在实际的C程序中,一个模块执行多个操作是很常见的事情.如果多个操作同时进行,会出现程序效率低下.计算机CPU占用率过高等情况,这时就需要对所有操作的执行顺序作一个合理的安排,这就涉及到定时器的使用.         本文对C程序中的定时器的类型.设置和清除方法等作了详细的介绍,为相关开发工作的开展提供了参考. [关键词]         C程序  定时器  操作  开发   一.定时器的定义及分类         我们

node.js中的定时器nextTick()和setImmediate()区别分析_node.js

1.node中使用定时器的问题在于,它并非精确的.譬如setTimeout()设定一个任务在10ms后执行,但是在9ms后,有一个任务占用了5ms,再次轮到定时器时,已经耽误了4ms. 好了node中的定时器就简单的讲这么多. 2.看代码: 复制代码 代码如下: process.nextTick(function(){     console.log("延迟执行"); }); console.log("正常执行1"); console.log("正常执行2

浅谈Node.js中的定时器_node.js

Node.js中定时器的实现 上一篇博文提到,在Node中timer并不是通过新开线程来实现的,而是直接在event loop中完成.下面通过几个JavaScript的定时器示例以及Node相关源码来分析在Node中,timer功能到底是怎么实现的. JavaScript中定时器功能的特点 无论是Node还是浏览器中,都有setTimeout和setInterval这两个定时器函数,并且其工作特点基本相同,因此下面仅以Node为例进行分析. 我们知道,JavaScript中的定时器并不同于计算机