定时任务

 cron 

 robfig/cron是一个第三方开源的任务调度库,适合于定时任务

 Github:github.com/robfig/cron

 官方文档:https://godoc.org/github.com/robfig/cron

 cron 表达式的基本格式

用过 linux 的应该对 cron 有所了解。linux 中可以通过 crontab -e 来配置定时任务。不过,linux 中的 cron 只能精确到分钟。而我们这里要讨论的 Go 实现的 cron 可以精确到秒,除了这点比较大的区别外,cron 表达式的基本语法是类似的。(如果使用过 Java 中的 Quartz,对 cron 表达式应该比较了解,而且它和这里我们将要讨论的 Go 版 cron 很像,也都精确到秒)

cron(计划任务),顾名思义,按照约定的时间,定时的执行特定的任务(job)。cron 表达式 表达了这种约定。

cron 表达式代表了一个时间集合,使用 6 个空格分隔的字段表示。

| 字段名 | 是否必须 | 允许的值 | 允许的特定字符 |
| - | -| - | - |
| 秒(Seconds) | 是 | 0-59 |  / , - |
| 分(Minutes) | 是 | 0-59 | 
 / , - |
| 时(Hours) | 是 | 0-23 |  / , - |
| 日(Day of month) | 是 | 1-31 | 
 / , – ? |
| 月(Month) | 是 | 1-12 or JAN-DEC |  / , - |
| 星期(Day of week) | 否 | 0-6 or SUM-SAT | 
 / , – ? |

注:
1)月(Month)和星期(Day of week)字段的值不区分大小写,如:SUN、Sun 和 sun 是一样的。
2)星期 (Day of week)字段如果没提供,相当于是 *

 特殊字符说明

1)星号(*)
表示 cron 表达式能匹配该字段的所有值。如在第5个字段使用星号(month),表示每个月

2)斜线(/)
表示增长间隔,如第1个字段(minutes) 值是 3-59/15,表示每小时的第3分钟开始执行一次,之后每隔 15 分钟执行一次(即 3、18、33、48 这些时间点执行),这里也可以表示为:3/15

3)逗号(,)
用于枚举值,如第6个字段值是 MON,WED,FRI,表示 星期一、三、五 执行

4)连字号(-)
表示一个范围,如第3个字段的值为 9-17 表示 9am 到 5pm 直接每个小时(包括9和17)

5)问号(?)
只用于日(Day of month)和星期(Day of week),\表示不指定值,可以用于代替 *

 一些常用的的 cron spec

| spec | 周期  |
| - | - |
/1      | 每秒  |
| 0 0 4   1 | 每周一凌晨四点钟 |

 使用demo

 简单单个任务

package main

import (
    "fmt"
    "time"

    "github.com/robfig/cron"
)

func main() {
    c := cron.New()

    c.AddFunc("*/1 * * * * *", func() {
        fmt.Println("every 1 seconds executing")
    })

    go c.Start()
    defer c.Stop()

    select {
    case <-time.After(time.Second * 10):
        return
    }
}

 多个定时任务

package main

import (
    "fmt"
    "log"

    "github.com/robfig/cron"
)

type TestJob struct {
}

func (t TestJob) Run() {
    fmt.Println("testJob1...")
}

type Test2Job struct {
}

func (t Test2Job) Run() {
    fmt.Println("testJob2...")
}

//启动多个任务
func main() {
    i := 0
    c := cron.New()

    //AddFunc
    spec := "*/5 * * * * ?"

    c.AddFunc(spec, func() {
        i++
        log.Println("cron running:", i)
    })

    //AddJob方法
    c.AddJob(spec, TestJob{})
    c.AddJob(spec, Test2Job{})

    //启动计划任务
    c.Start()

    //关闭着计划任务, 但是不能关闭已经在执行中的任务.
    defer c.Stop()
    select {}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
qinhan
讨论数量: 4
qinhan

欢迎指正

4年前 评论
qinhan

欢迎指正

4年前 评论

我做了一个基于/robfig/cron包和gin框架的http server来管理定时任务,提供了api来添加定时任务、删除定时任务、修改定时任务、查看定时任务,并且可以查看执行日志,算是一个学习项目吧,也欢迎指正和star
地址:cronmanager

4年前 评论
阿麦

好奇问个问题 这个东西执行后会等到任务执行完自动结束么 还是这个功能一单运行就会自动在后台保持?

4年前 评论
qinhan (楼主) 4年前
qinhan (楼主) 4年前
阿麦 (作者) 4年前
阿麦 (作者) 4年前

实在不好意思,我提交的还是有问题 :joy:

4年前 评论
qinhan (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!