什么是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

Python APScheduler

Barin Kernighan