Cron定时任务是很常用的应用场景,在linux使用Crontab配置表达式来实现按规则定时执行任务。Golang如何实现按Cron表达式执行定时任务呢?本文介绍使用robfig/cron包来实现定时任务。

引入依赖包

1
go get github.com/robfig/cron/v3

Golang使用robfig/cron实现定时任务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import (
	"fmt"
	"github.com/robfig/cron/v3"
	"time"
)

func main() {
	// 创建一个新的Cron实例
	c := cron.New()

	// 添加定时任务,每分钟的第0秒打印当前时间
	_, err := c.AddFunc("0 * * * * *", func() {
		fmt.Println("Every minute:", time.Now())
	})

	// 检查是否有错误
	if err != nil {
		fmt.Println("Error scheduling job:", err)
		return
	}

	// 启动定时任务
	c.Start()

	// 主程序进入无限循环,这样定时任务就可以持续运行
	for {
	}
}

crontab表达式的用法

crontab 表达式用于在类 Unix 系统中安排定时任务。它由五个字段组成,每个字段代表一个时间单位,用于指定任务执行的时间和频率。以下是 crontab 表达式的组成部分:

  1. 分钟 (Minutes):0 - 59
  2. 小时 (Hours):0 - 23
  3. 日期 (Day of Month):1 - 31
  4. 月份 (Month):1 - 12 或 JAN-DEC
  5. 星期几 (Day of Week):0 - 7 或 SUN-SAT;7 或 0 代表星期天

这些字段可以包含特定的值、范围、列表或特殊字符:

  • *(星号):代表所有可能的值。例如,分钟字段的 * 表示“每分钟”。
  • ?(问号):仅在日期和星期几字段中使用,表示不指定值。
  • -(连字符):表示一个范围。例如,1-5 表示从 1 到 5。
  • /(正斜杠):表示起始时间开始,每隔一定时间执行一次。例如,0/30 在分钟字段表示“每小时的第 0 和第 30 分钟”。
  • ,(逗号):用于列表。例如,1,3,5 表示在第 1、3、5 分钟。

以下是一些 crontab 表达式的例子:

  • 0 * * * *:每小时的整点执行。
  • 30 1 * * *:每天凌晨 1 点 30 分执行。
  • 0 8-18 * * 1-5:在周一到周五的每天上午 8 点到下午 6 点之间,每小时的整点执行。
  • 0 9,13,17 * * 1-5:在周一到周五的每天上午 9 点、下午 1 点和下午 5 点执行。
  • */10 * * * *:每 10 分钟执行一次。
  • 0 0/2 * * *:每小时的第 0和第 2分钟执行(即每小时的0分和2分)。