关于Linux中作业调度 crond 和 systemd.timer 使用场景的一些笔记
我们承受所有的不幸,皆因我们无法独处 ——叔本华
写在前面
- 分享一些
systemd.timer
相关的笔记 - 博文内容涉及:
systemd.timer
的一些介绍cron
VSsystemd.timer
区别- 如何创建
systemd.timer
作业调度
- 理解不足小伙伴帮忙指正
我们承受所有的不幸,皆因我们无法独处 ——叔本华
关于 systemd.timer
的一些介绍
crond
这里不多介绍,小伙伴们应该都接触过。所以直接来看 systemd.timer
systemd 的 timer 单元。 用于封装一个基于时间触发的动作。它取代了传统的 atd, crond 等任务计划服务。参见 systemd.timer(5) 手册。, 换句话讲,就是对crond
的任务进行了细粒度的处理,以前我们通过 bash 脚本处理的一些调度策略,现在可以通过 systemd.timer
来实现。
systemctl list-unit-files -t timer
命令可以查看当前系统的 timer 单元
1 | ┌──[root@liruilongs.github.io]-[/etc/tmpfiles.d] |
systemctl status systemd-tmpfiles-clean.timer
可以查看具体的状态信息
1 | ┌──[root@liruilongs.github.io]-[/etc/tmpfiles.d] |
systemctl cat systemd-tmpfiles-clean.timer
命令可以查看相关配置信息
1 | ┌──[root@liruilongs.github.io]-[/etc/tmpfiles.d] |
上面的配置中,OnBootSec=15min
表示系统启动后15分钟执行,OnUnitActiveSec=1d
表示间隔多长时间执行下一次。
那么这里执行什么,如果没有显示的定义 unit
字段,默认是和 timer
同名 service
单元。
1 | ┌──[root@liruilongs.github.io]-[/etc/tmpfiles.d] |
需要注意的是,如果当前Service unit
是 active
状态,那么定时任务是不会执行的,所以这里和 crond
有一定的区别,如果是crond
只能通过 bash
任务内部判断.
对应timer
中 service
的单元文件
1 | ┌──[root@liruilongs.github.io]-[/etc/tmpfiles.d] |
可以通过 journalctl
来看看单元对应的日志信息
1 | ┌──[root@liruilongs.github.io]-[/etc/tmpfiles.d] |
systemctl list-timers --no-pager
可以列出当前已经生效的定时器
1 | ┌──[root@liruilongs.github.io]-[~] |
查看单个定时器的 详细信息
1 | ┌──[root@liruilongs.github.io]-[~] |
关于 timer
单位文件具体的参数我们可以通过帮助文档查看 帮助手册查看 man systemd.timer
1 | ┌──[root@liruilongs.github.io]-[/etc/tmpfiles.d] |
crond 于 systemd.timer 的区别
虽然 systemd
定时器单元可以用来安排类似 cron
的工作,但两者之间有明显的优缺点。systemd.timer
更独立,但是配置略麻烦,crond
配置简单,所以相对功能简单,当前用户的所有任务在一起配置
Systemd
计时器单元基本上是 systemd
服务,随之而来的是所有功能和优势,包括但不限于:
- 作业可以有依赖项(可以依赖于其他 systemd 服务),可以设置前置后置依赖,可以运用于一些调度场景,这一点事
- 定时器单元被记录到
systemd
日志中,可以通过journalctl -u
来查看日志信息 - 可以轻松地运行一个独立的定时器的作业。可以作为一个工具存在,
crond,at
的所有作业是依赖于crond
等服务的 - 计时器单元可以有一个很好的值,也可以使用
cgroups
来管理资源。 - Systemd 计时器单元可以由
启动和硬件更改
等事件触发。 - 可以使用
systemctl
轻松管理,禁用或启用。 - 定时器单元可以使用
实时
或单调时间
。
与 systemd
计时器相比,Cron 有几个明显的好处。
- 配置 cron 作业是一个简单的过程。
- Cron 能够使用
MAILTO
功能发送电子邮件。
创建 sustemd.timer unit
来看一个小Demo,我们希望在指定时间周期重启服务,创建 systemd.timer unit 我们需要下面两个单元:
- 作业运行的定时器单元
- 重启任务的服务单元
以 httpd 服务为例,当前到的服务状态为 inactive
1 | ┌──[root@liruilongs.github.io]-[~] |
创建重启服务的 Service unit
1 | ┌──[root@liruilongs.github.io]-[~] |
创建定时器的 timer units
这里我么使用 OnCalendar=*:*:10
设置每分钟10秒的时候z周期执行 Service。OnwBootSec=3s
在系统开机多久执行 ,当然也可以尝试其他的字段,具体可以看下文档
1 | ┌──[root@liruilongs.github.io]-[~] |
写完之后要做文件校验
1 | ┌──[root@liruilongs.github.io]-[~] |
* *-*-* *:*:*
*
- 表示一周中的某一天,例如:- Sat,Thu,Mon*-*-*
- 表示日历日期。这意味着它分解为year-month-date
。2021-10-15
是 10 月 15 日*-10-15
表示每年的 10 月 15 日*-01-01
意味着每个新年。
*:*:*
是表示日历事件的时间分量 -hour:minute:second
常见的表达式:
- 每一分钟
*-*-* *:*:00
- 每 5 分钟
*-*-* *:*/5:00
- 每 60 分钟
*-*-* */1:00:00
- 每 1 小时
*-*-* *:00:00
- 每 3 小时
*-*-* */3:00:00
- 每隔一小时
*-*-* */2:00:00
- 每 12 小时
*-*-* */12:00:00
- 在特定时间之间
*-*-* 9-17:00:00
- 每天
*-*-* 00:00:00
- 每天凌晨 1 点
*-*-* 01:00:00
- 每晚午夜
*-*-* 00:00:00
- 每周六 Sat
*-*-* 00:00:00
- 星期一到星期五
Mon...Fri *-*-* 00:00:00
- 每周末
Sat,Sun *-*-* 00:00:00
- 每 7 天
* *-*-* 00:00:00
- 每个月
* *-*-01 00:00:00
- 每个季度
* *-01,04,07,10-01 00:00:00
- 每 6 个月
* *-01,07-01 00:00:00
- 每年
* *-01-01 00:00:00
执行定时器
1 | ┌──[root@liruilongs.github.io]-[~] |
通过 systemctl list-timers restart-httpd.timer
我们可以查看定时计划的详细信息,next 表示下一秒执行的时间
1 | ┌──[root@liruilongs.github.io]-[~] |
配置指定在未来的某个时间执行
1 | ┌──[root@liruilongs.github.io]-[~] |
查看执行日志
1 | ┌──[root@liruilongs.github.io]-[~] |
在次查看状态,就没有下一次执行的时间了
1 | ┌──[root@liruilongs.github.io]-[~] |
当然如果是一次性的,我们可以使用 systemc-run
命令来处理, systemc-run
命令可以创建一些临时的 systemd units ,比如常见的临时命令利用 Cgroup 限制资源,
1 | ┌──[root@liruilongs.github.io]-[~] |
使用 systemc-run
可以创建一个在一段时间后执行的Service unit,这里的命令行会自动包装成 对应的 timer,service 单元
1 | ┌──[root@liruilongs.github.io]-[~] |
博文引用资源
http://www.jinbuguo.com/systemd/systemd.html#
https://www.putorius.net/using-systemd-timers.html#
https://blog.csdn.net/weixin_42347739/article/details/112406369
https://silentlad.com/systemd-timers-oncalendar-(cron)-format-explained
关于Linux中作业调度 crond 和 systemd.timer 使用场景的一些笔记
https://liruilongs.github.io/2022/10/27/Linux/关于Linux中作业调度-crond-和-systemd-timer-使用场景的一些笔记/