抛弃 cron 拥抱 systemd timer

坑:记得所有的路径都要用绝对路径

Timers 是以 .timer 为后缀名的 systemd 单元文件,用于控制 .service 文件或事件。Timers 可用来替换 cron(阅读 #替代 cron)。Timers 内置了日历定时事件和单调定时事件的支持,并可以异步执行这些事件

定时器单元

Timers 是以 .timer 为后缀的 systemd 单元文件。Timers 和其他单元配置文件是类似的,它通过相同的路径加载,不同的是包含了 [Timer] 部分。 [Timer] 部分定义了何时以及如何激活定时事件。Timers 可以被定义成以下两种类型:

单调定时器 即从一个时间点过一段时间后激活定时任务。所有的单调计时器都遵循如下形式: OnTypeSec=。 OnBootSec 和 OnActiveSec 是常用的单调定时器。

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

服务单元

每个 .timer 文件所在目录都得有一个对应的 .service 文件(如 foo.timer 和 foo.service)。.timer 用于激活并控制 .service 文件。 .service 文件中不需要包含 [Install] 部分,因为这由 timer 单元接管。必要时通过在定时器的 [Timer] 部分指定 Unit= 选项来控制一个与定时器不同名的服务单元。

示例

Service 单元只是定义了如何执行任务

首先创建个 app_spider_article.service

Service 单元就是所要执行的任务,比如发送邮件就是一种 Service。

新建 Service 非常简单,就是在/usr/lib/systemd/system目录里面新建一个文件,比如mytimer.service文件,你可以写入下面的内容。

可以看到,这个 Service 单元文件分成两个部分。

[Unit]部分介绍本单元的基本信息(即元数据),Description字段给出这个单元的简单介绍(名字叫做MyTimer)。

[Service]部分用来定制行为,Systemd 提供许多字段。

  • ExecStartsystemctl start所要执行的命令
  • ExecStopsystemctl stop所要执行的命令
  • ExecReloadsystemctl reload所要执行的命令
  • ExecStartPreExecStart之前自动执行的命令
  • ExecStartPostExecStart之后自动执行的命令
  • ExecStopPostExecStop之后自动执行的命令

注意,定义的时候,所有路径都要写成绝对路径,比如bash要写成/bin/bash,否则 Systemd 会找不到。

现在,启动这个 Service。

如果一切正常,你应该就会收到一封邮件。

要定时执行这个 Service,还必须定义 Timer 单元。

app_spider_article.timer

[Unit]部分定义元数据。

[Timer]部分定制定时器。Systemd 提供以下一些字段。

  • OnActiveSec:定时器生效后,多少时间开始执行任务
  • OnBootSec:系统启动后,多少时间开始执行任务
  • OnStartupSec:Systemd 进程启动后,多少时间开始执行任务
  • OnUnitActiveSec:该单元上次执行后,等多少时间再次执行
  • OnUnitInactiveSec: 定时器上次关闭后多少时间,再次执行
  • OnCalendar:基于绝对时间,而不是相对时间执行
  • AccuracySec:如果因为各种原因,任务必须推迟执行,推迟的最大秒数,默认是60秒
  • Unit:真正要执行的任务,默认是同名的带有.service后缀的单元
  • Persistent:如果设置了该字段,即使定时器到时没有启动,也会自动执行相应的单元
  • WakeSystem:如果系统休眠,是否自动唤醒系统

上面的脚本里面,OnCalendar=*-*-* 13:38:00 表示 每天凌晨 13点38分执行任务 ,OnUnitActiveSec=1h表示一小时执行一次任务。其他的写法还有OnUnitActiveSec=*-*-* 02:00:00表示每天凌晨两点执行,OnUnitActiveSec=Mon *-*-* 02:00:00表示每周一凌晨两点执行,具体请参考官方文档

[Install]部分,定义开机自启动(systemctl enable)和关闭开机自启动(systemctl disable)这个单元时,所要执行的命令。

定时器的相关命令

下面,启动刚刚新建的这个定时器。

你应该立刻就会收到邮件,然后每个小时都会收到同样邮件。

查看这个定时器的状态。

查看所有正在运行的定时器。

关闭这个定时器。

下次开机,自动运行这个定时器。

关闭定时器的开机自启动。

修改timer 后

日志相关命令

如果发生问题,就需要查看日志。Systemd 的日志功能很强,提供统一的命令。

启动定时任务

参考:

http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
https://www.imooc.com/article/28208
https://wiki.archlinux.org/index.php/Systemd/Timers_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#%E5%AE%9A%E6%97%B6%E5%99%A8%E5%8D%95%E5%85%83




HTTPX 基础教程-新乡seo|网站优化,网站建设_微信公众号:zeropython—昊天博客