systemd创建定时任务

Easter79
• 阅读 623

Systemd or Cron

Cron是类Unix系统里最常见的任务计划程序,而Systemd也开始提供定时器作为Cron的替代品。尽管争议不断,Systemd还是被越来越多的Linux发行版使用,Ubuntu也是如此。因此在需要创建定时任务时我决定向"邪恶势力"低头,基于Systemd来实现。

Systemd配置根据功能划分到不同的单元,如系统服务(.service)属于服务单元,定时器(.timer)则属于定时器单元。每种单元有自己的配置文件格式。

不同于Cron通过crontab一行添加一个定时任务,Systemd要创建定时任务需要创建两个文件,一个定时器单元文件定义定时任务的激活时间,一个服务单元文件定义定时器激活时执行的具体任务。从这个角度想,相当于定时任务激活时通过systemctl start XXX.service启动了一个系统服务。不过一个定时任务需要两个文件这种方式还是很麻烦了。

systemd创建定时任务的主要步骤

  • 创建服务单元文件
  • 创建定时器单元文件
  • 启动定时器

创建定时器单元文件

定时器单元文件是以timer为后缀的systemd单元文件,定时器单元文件包括三个部分

  • Unit
  • Timer
  • Install

[Unit]部分定义了systemd单元文件通用的一些配置,[Install]部分定义安装systemd单元需要的配置,在systemd执行过程中不会用到,仅在调用systemctl enable或者systemctl disable设置开机启动时需要。

[Timer]部分定义了何时以及如何激活定时事件。Timers 可以被定义成以下两种类型:

  • 单调定时器
  • 实时定时器

单调定时器

单调定时器 即从一个时间点过一段时间后激活定时任务。所有的单调计时器都遵循如下形式: OnTypeSec=。有以下几种类型

* OnActiveSec 时间点为定时器启动
* OnBootSec 时间点为系统启动
* OnStartupSec 时间点为systemd启动时间
* OnUnitActiveSec 时间点为上次定时器任务激活时间
* OnUnitInactiveSec 时间点为上次定时器任务执行完毕的时间

不同的类型可以组合,如下面的配置,在系统启动15分钟后第一次执行,之后每隔1周执行一次。

[Timer]
OnBootSec=15min
OnUnitActiveSec=1w 

时间间隔的所有定义格式可以通过man systemd.time查看。

实时定时器

实时定时器 (亦称"挂钟定时器") 通过日历事件激活(类似于 cronjobs )定时任务。 使用 OnCalender= 来定义实时定时器。

如下面的配置OnCalendar=Wed, 23:15表示每周三的23点15分执行。日历事件的详细定义格式可以通过man systemd.time查看。

下面是一个定时器单元文件。

[Unit]
Description=Run foo weekly and on boot

[Timer]
OnCalendar=Wed, 23:15

[Install]
WantedBy=timers.target

创建服务单元文件

服务单元文件也包括三部分,只是没有[Timer]部分,增加了[Service]部分,这部分定于服务执行相关的配置,最常用的是ExecStart,设置服务启动时需要执行的操作。

如下面的服务单元文件,ExecStart=/usr/local/bin/foo表示启动时执行foo程序。

[Unit]
Description=MyScript

[Service]
ExecStart=/usr/local/bin/foo

这里的服务单元只由定时器单元调用,所以不需要[Install]部分。

单元文件路径

单元文件要放在Systemd指定的路径才能生效。Systemd单元按照运行模式分两种,system模式和user模式。 system模式只要系统在运行就会生效,而user模式在用户登录状态才会生效。两种模式下单元文件的路径也不同。

Systemd在system模式下加载单元文件的路径,优先级从高到低有

  • /etc/systemd/system
  • /run/systemd/system
  • /lib/systemd/system

Systemd在user模式下加载单元文件的路径,优先级从高到低有

  • $XDG_CONFIG_HOME/systemd/user
  • $HOME/.config/systemd/user
  • /etc/systemd/user
  • $XDG_RUNTIME_DIR/systemd/user
  • /run/systemd/user
  • $XDG_DATA_HOME/systemd/user
  • $HOME/.local/share/systemd/user
  • /usr/lib/systemd/user

创建定时器时,定时器单元文件和服务单元文件必须在同一个目录下,且文件名相同,只是后缀不同(一个为.timer,一个为.service)。如创建名为foo的定时器任务,运行在system模式,可以在/etc/systemd/system/下建立一个foo.timer文件和一个foo.service文件。

定时器启动和停止

Systemd的命令行操作是用过systemctl命令实现的。

启动定时器

$ systemctl start XXX.timer

停止定时器

$ systemctl stop XXX.timer

设置开机自动启动

$ systemctl enable XXX.timer

取消开机启动

$ systemctl disable XXX.timer

查看运行状态

查看已启动的所有定时器

$ systemctl list-timers

查看定时器的运行状态

systemctl status XXX.timer

定时器运行出错时需要查看日志进行分析,systemd日志为二进制格式,可以通过journal命令查看

$ journal -xe
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
京东云开发者 京东云开发者
8个月前
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
5个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k