定时任务处理与CRON表达式学习:定义、应用实例和发展由来
什么是Cron表达式
Cron 表达式是一种用于指定定时任务执行时间的字符串表达式,常见于各种需要周期性处理的场景,可以满足复杂的周期时间记法,便于完成周期定时任务。
标准的Cron表达式格式如下,但在不同环境下还会有些区别:
* * * * * command
- - - - -
| | | | |
| | | | +----- 星期几 (0 - 7) (Sunday=0 or 7)
| | | +---------- 月份 (1 - 12)
| | +--------------- 日期 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
特殊字符
- 星号(*):代表任何值。例如,在分钟字段中使用星号表示每一分钟;
- 逗号(,):用于分隔列表值。例如,在小时字段中使用
1,2,3
表示在1点、2点和3点执行任务; - 短横线(-):用于表示范围。例如,在日期字段中使用
1-5
表示从1号到5号; - 斜线(/):用于指定步长值。例如,在分钟字段中使用
*/15
表示每15分钟执行一次。
语法示例
# 每天凌晨2:30执行任务
30 2 * * * /path/to/command
# 每周一至周五的上午10:00执行任务
0 10 * * 1-5 /path/to/command
# 每隔5分钟执行一次任务
*/5 * * * * /path/to/command
应用场景
Linux Crontab
Linux crontab
命令是 cron table 的简写,crontab
允许不同用户创建独立的crontab任务,存放在/var/spool/cron/下。
命令语法
usage: crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
(default operation is replace, per 1003.2)
-e (编辑用户的 crontab)
-l (列出用户的 crontab)
-r (删除用户的 crontab)
-i (删除crontab前提示)
应用场景
注意:执行crontab作业的用户应具有脚本执行权限。
# 编辑当前用户crontab
crontab -e
# 假装我们有一个备份脚本,在每天凌晨一点执行一次
0 1 * * * /path/to/backup.sh
Python APScheduler
APScheduler需要安装:pip install apscheduler
;
Python有许多实现定时任务的方式,详情可参见参考阅读部分链接。
APScheduler(Advanced Python Scheduler)是一款轻量级的定时任务调度框架,这个框架提供了多种调度方式,包括但不限于基于日期、固定时间间隔或者cron风格的计划任务。其包含四个组件:
- triggers 触发器
- job stores 作业存储器
- executors 执行器
- schedulers 调度器
一个简单的示例展示cron风格的周期性任务:
from apscheduler.schedulers.background import BackgroundScheduler
import datetime
def job_function():
print(f"The job is run at {datetime.datetime.now()}")
# 创建调度器实例
scheduler = BackgroundScheduler()
# 添加一个作业,使用cron触发器每天凌晨1点执行
scheduler.add_job(job_function, 'cron', hour=1, minute=0)
# 启动调度器
scheduler.start()
# 这个例子中,调度器将在后台运行,主程序可以继续执行其他任务
# 假设我们想要运行调度器一段时间后停止它
try:
# 其他任务...
import time
time.sleep(10) # 运行10秒后停止调度器
except (KeyboardInterrupt, SystemExit):
pass
# 停止调度器
scheduler.shutdown()
Cron的由来和发展
我们知道,每一个技术的诞生都是为了解决特定的问题,秉着“知其然,知其所以然,知其曾已然”的精神,我简单地搜集了一些关于Cron由来的材料,并作总结分享。
Cron这个术语源自希腊语单词"Chronos",它在希腊语中表示“时间”。Cron实际上是“Chronograph”的简化形式,意为“计时器”。
在Cron出现之前,Unix系统中有一个名为at
的命令,它允许用户安排在未来的某个时间点执行一次任务。at
命令对于执行一次性任务非常有用,但它无法满足定期执行任务的需求。
Cron的第一个版本由Brian Kernighan在Version 7 Unix中实现。Cron的设计目标是提供一个能够在预定时间自动执行任务的工具,从而解放系统管理员和用户的双手。
1987年,Paul Vixie对Cron进行了重大改进,创建了Vixie Cron,这是目前大多数Linux发行版中使用的Cron版本。Vixie Cron增加了许多新功能,包括更精确的时间控制、用户权限管理、以及更丰富的日志记录。
参考阅读
Cron
Linux Crontab
- Linux Crontab 定时任务 | 菜鸟教程 (runoob.com)
- vixie/cron: Vixie Cron, an open source implementation of POSIX Cron, later imported into BSD and Linux (github.com)
Python APScheduler
- Python 定时任务的实现方式--sched模块 - zntest - 博客园 (cnblogs.com)
- APScheduler(Python化的Cron)使用总结 定时任务 - 星河赵 - 博客园 (cnblogs.com)
- User guide — APScheduler 3.10.4.post2 documentation