使用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/bash
echo "$(date)" >> /tmp/output.txt

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

sudo systemctl daemon-reload
sudo systemctl start mytest.timer
sudo systemctl start mytest.service

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

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

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

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

最后,希望这篇文章能帮到正在努力的你,欢迎关注评论!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容