使用Systemd配置定时任务

在Linux世界中,提到定时任务,第一个想到的肯定是Cron,其实Systemd也可以实现定时任务,相比较Cron,Systemd实现的定时任务有以下优点:

  • 可以限制任务使用CPU的额度,比如任务最多占用20%的CPU
  • 任务可以方便拆分,比如可以创建相互依赖的线性任务
  • 自动生成日志,配合Systemd的日志工具,方便查看和排错

Timer units

Systemd通过创建结尾为“.timer”的文件来创建定时任务,该文件用来控制指定的“.service”。Timer unit文件和Systemd其他的单元配置文件类似,唯一不同是文件中包含“[Timer]”,其用来定义什么时间和如何激活计时器,“Timer”有两种定义方式:

  • Realtime timers(即真实时间),Cron也是使用这种方式定义定时任务的执行时间。使用选项“OnCalendar=”来定义这种类型的Timer
  • Monotonic timers,相对于一个起始点指定一个时间段,过了这个时间段后激活计时器。在电脑关机的情况下这些计时器会停掉。有很多不同种类的“monotonic timers”,都包含“OnTypeSec=”,常用的有“OnBootSec”、“OnUnitActiveSec”。

Service units

每一个“.timer”文件必须有一个对应的“.service”文件存在,这样计时器才有意义。默认情况下,如果Timer和Service的文件名(不包含扩展名)相同,则“.timer”文件控制“.service”文件的运行,比如“foo.timer”和“foo.service”。当然文件名也可以不同,这时需要在“.timer”文件的“[Timer]”内配置“Unit”选项,将要控制的“.service”文件名写入即可。

注意,“.service”不需要再包含“[Install]”,因为“.timer”文件已经包含了。

单元管理的常用命令

  • systemctl start [UnitName] //启动单元
  • systemctl stop [UnitName] //关闭单元
  • systemctl restart [UnitName] //重启单元
  • systemctl kill [UnitName] //杀死单元进程
  • systemctl status [UnitName] //查看单元状态
  • systemctl enable [UnitName] //开机自动执行该单元
  • systemctl disable [UnitName] //关闭开机自动执行
  • systemctl list-unit-files //查看所有单元
  • systemctl list-unit-files --type service //查看所有service单元
  • systemctl list-unit-files --type timer //查看所有timer单元
  • systemctl list-timers //查看所有已启动的timer

示例

下面通过一个具体的例子,展示“monotonic timer”和“realtime timer”文件的配置

(1)Monotonic timer

系统启动15分钟后和每周都运行(这里是或的关系)

/usr/lib/systemd/system/foo.timer-----------------------------------------------------[Unit]Description=Run foo weekly and on boot[Timer]OnBootSec=15min OnUnitActiveSec=1w [Install]WantedBy=timers.target

(2)Realtime timer

每周一的12:00 AM运行

/usr/lib/systemd/system/foo.timer-----------------------------------------------------[Unit]Description=Run foo weekly[Timer]OnCalendar=weekly[Install]WantedBy=timers.target

当需要更精确的时间控制,按照下面时间格式配置“OnCalendar”,

DayOfWeek Year-Month-Day Hour:Minute:Second

星号表示任何值,逗号用于隔开可能的值,使用“..”隔开的值表示一个连续范围。下面表示每个月头四天的“12:00 PM”且当天是星期一或星期二激活计时器。

OnCalendar=Mon,Tue *-*-01..04 12:00:00

关于“OnCalendar”更加详细的介绍可参考systemd.time(7)。

(3)配置一个完整的例子,包含“.timer”文件和“.service”文件,展示Systemd中配置定时任务,

/usr/lib/systemd/system/mytest.service

[Unit]Description=MyTimer[Service]ExecStart=/tmp/echo-date.sh

/usr/lib/systemd/system/mytest.timer

[Unit]Description=Runs mytimer every minute[Timer]OnUnitActiveSec=1m[Install]WantedBy=multi-user.target

/tmp/echo-date.sh,记得给该文件赋予可执行权限

#!/bin/bashecho '$(date)' >> /tmp/output.txt

配置完“mytest.service”和“mytest.timer”文件后,运行下面命令,

sudo systemctl daemon-reloadsudo systemctl start mytest.timersudo systemctl start mytest.service

查看“/tmp/output.txt”,内容如下:

aneirin@host-1:$ cat /tmp/output.txt Wed Jan 27 10:38:37 CST 2021Wed Jan 27 10:39:37 CST 2021

总结

本文对Systemd配置定时任务做了简单的介绍,它完全可以作为Cron的替代工具使用,但Timer也不是十全十美的,相对于Cron,它有两点不足:

  1. 为了实现定时任务需要配置两个文件,而Cron仅需要一行
  2. 发送邮件不方便,Cron有现成的发送邮件选项“MAILTO”
(0)

相关推荐

  • Linux结构目录详解

    在Linux中,系统默认的用户是root,其实和 windows 的 administrator 类似,root 用户可以操作操作系统的任何文件和设备,OMG,记住了,是大哥大,干啥都行,所以在生产环 ...

  • (25条消息) 拾遗:systemctl

    参考:https://wiki.gentoo.org/wiki/Systemd systemd 支持普通用户定义的 unit[s] 开机启动 systemctl --user enable/disab ...

  • Linux系统如何创建任务?操作方法!

    Linux系统是当下非常受欢迎的系统,受到很多人的喜欢,同时在Linux运行过程中我们经常会遇到各种各样定时任务,那么在Linux系统下如何创建定时任务? 以MySQL定时备份,创建一个用于执行MyS ...

  • 实战记录在 Linux Ubuntu 20.04 安装VNC 远程桌面

    Virtual Network Computing (VNC),是一个图形桌面共享系统,允许我们像使用Windows桌面系统一样可视化的使用键盘和鼠标远程控制服务器,当做一台远程的电脑一样. 主要用在 ...

  • 来自斯坦福的廉价机器狗.中

    因为上篇文章没有对shell脚本做完全的解析,比较遗憾,这篇补上. 我们继续来研究这个 它的功能是为某一个文件或目录在另外一个位置建立一个同步的链接, 类似Windows下的超级链接. 创建的链接有两 ...

  • SpringBoot 2.2.5 整合Quartz,配置动态增删改查定时任务,并解决Job中不能注入Bean问题

    前言:该博客主要是记录自己学习的过程,方便以后查看,当然也希望能够帮到大家. 由于工作上的需要,初步了解Quartz后进行使用.完整代码地址在结尾!! 第一步,在pom.xml文件中加入依赖,如下 & ...

  • Spring Boot 配置 Quartz 定时任务

    Quartz有四个核心概念: Job:是一个接口,只定义一个方法 execute(JobExecutionContext context),在实现接口的 execute 方法中编写所需要定时执行的 J ...

  • 微服务实践之分布式定时任务

    承接上篇:上篇文章讲到改造 go-zero 生成的 app module 中的 gateway & RPC .本篇讲讲如何接入 异步任务 以及 log的使用. Delay Job 日常任务开放 ...

  • 配置CLion管理Qt项目国际化支持

    随着Qt 6的发布,cmake也正式宣告接管qmake的工作了. 在之前的一篇博客里我介绍了如何使用cmake管理你的qt项目,不过有一点我没有讲,那就是对国际化(i18n)的处理. 今天我们就来介绍 ...

  • ifconfig配置或显示网络接口信息-Linux运维技能

    ifconfig命令用于配置网卡IP地址等网络参数或显示当前网络的接口状态.ifconfig命令在配置网卡信息时必须以root用户的身份来执行.ifconfig命令是Linux运维日常工作中常用到的核 ...

  • 高配置的《秘密访客》因何哑火?

    网视导读:五一档中悬疑片<秘密访客>在戏外的命运比起影片内容似乎反转更多.秘密为何哑火,家庭题材难把握,台湾悬疑片的民俗元素又能给我们带来多少惊喜? 秘密哑火 <秘密访客>无论 ...

  • 同配置i5-11300H处理器,联想和戴尔的两款轻薄本如何选

    最近朋友想买5000元的笔记本,想了解下是i5-1135G7好,还是AMD的R5 5500U好.评价君则觉得,既然到了5000元档了,就不要再在15W低功耗处理器产品里打转了,直接选择标压处理器笔记本 ...

  • SINAMICS V90 PN 伺服系统的配置示例

    FSB 用于单相电网的连接图: FSD 用于三相电网的连接图: ⚠警告接线错误导致人身伤害和设备损坏 错误的接线会导致较高的电击和短路风险,从而会对人员安全和设备造成危害. · 驱动与电机必须直接连接 ...

  • 家庭园艺宝典,一份最全面的植物栽培盆土配置小秘方

    种在阳台上 喜欢种在阳台上的台友们,有喜欢种菜的,有喜欢养果树的,有喜欢养花的.养苔藓的,还有喜欢制作盆景的.当然台友中不乏台长这样喜欢混搭着,啥都喜欢种,啥都要种来试试的. 话说,咱们种在自家阳台上 ...