https://github.com/robfig/cron

表达式

字段名 是否必须 允许的值 允许的特定字符
秒(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. 1)星号(*)
  2. 表示 cron 表达式能匹配该字段的所有值。如在第5个字段使用星号(month),表示每个月
  3. 2)斜线(/)
  4. 表示增长间隔,如第1个字段(minutes) 值是 3-59/15,表示每小时的第3分钟开始执行一次,之后每隔 15 分钟执行一次(即 3183348 这些时间点执行),这里也可以表示为:3/15
  5. 3)逗号(,)
  6. 用于枚举值,如第6个字段值是 MON,WED,FRI,表示 星期一、三、五 执行
  7. 4)连字号(-)
  8. 表示一个范围,如第3个字段的值为 9-17 表示 9am 5pm 直接每个小时(包括917
  9. 5)问号(?)
  10. 只用于日(Day of month)和星期(Day of week),\表示不指定值,可以用于代替 *

cron举例说明

每隔5秒执行一次:/5 ?
每隔1分钟执行一次:0
/1 ?
每天23点执行一次:0 0 23
?
每天凌晨1点执行一次:0 0 1
?
每月1号凌晨1点执行一次:0 0 1 1
?
在26分、29分、33分执行一次:0 26,29,33 ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21
* ?

您可以使用几个预定义的表达式来代替上表的表达式

输入 描述 等式
@yearly (or @annually) 每年1月1日午夜跑步一次 0 0 0 1 1 *
@monthly 每个月第一天的午夜跑一次 0 0 0 1
@weekly 每周周六的午夜运行一次 0 0 0 0
@daily (or @midnight) 每天午夜跑一次 0 0 0 *
@hourly 每小时运行一次 0 0

type Chain

  1. type Chain struct {
  2. // contains filtered or unexported fields
  3. }
  4. func NewChain(c ...JobWrapper) Chain
  5. func (c Chain) Then(j Job) Job
  6. // NewChain(m1, m2, m3).Then(job)
  7. is equivalent to:
  8. // m1(m2(m3(job)))

type ConstantDelaySchedule

Every返回crontab Schedule,在每个持续时间内激活一次。不支持小于1秒的延迟(将四舍五入到1秒)。任何小于Second的字段都会被截断。

  1. type ConstantDelaySchedule struct {
  2. Delay time.Duration
  3. }
  4. func (schedule ConstantDelaySchedule) Next(t time.Time) time.Time
  5. func Every(duration time.Duration) ConstantDelaySchedule

type Job

  1. type Job interface {
  2. Run()
  3. }

type Logger

  1. type Logger interface {
  2. // Info logs routine messages about cron's operation.
  3. Info(msg string, keysAndValues ...interface{})
  4. // Error logs an error condition.
  5. Error(err error, msg string, keysAndValues ...interface{})
  6. }
  7. var DefaultLogger Logger = PrintfLogger(log.New(os.Stdout, "cron: ", log.LstdFlags))
  8. var DiscardLogger Logger = PrintfLogger(log.New(ioutil.Discard, "", 0))
  9. // 只记录error
  10. func PrintfLogger(l interface{ Printf(string, ...interface{}) }) Logger
  11. // 记录所有日志
  12. func VerbosePrintfLogger(l interface{ Printf(string, ...interface{}) }) Logger

type JobWrapper

  1. type JobWrapper func(Job) Job
  2. func DelayIfStillRunning(logger Logger) JobWrapper // 运行超一分钟的任务打印log
  3. func Recover(logger Logger) JobWrapper
  4. // 如果之前的调用还在运行,则不调用并打印日志
  5. func SkipIfStillRunning(logger Logger) JobWrapper

type Entry

  1. type Entry struct {
  2. ID EntryID
  3. Schedule Schedule
  4. Next time.Time //下一次运行时间
  5. Prev time.Time //上一次运行时间
  6. WrappedJob Job
  7. Job Job
  8. }

func (e Entry) Valid() bool

type ScheduleParser

  1. type ScheduleParser interface {
  2. Parse(spec string) (Schedule, error)
  3. }

type Parser

  1. type Parser struct {
  2. // contains filtered or unexported fields
  3. }
  4. func NewParser(options ParseOption) Parser
  5. // Standard parser without descriptors
  6. specParser := NewParser(Minute | Hour | Dom | Month | Dow)
  7. sched, err := specParser.Parse("0 0 15 */3 *")
  8. // Same as above, just excludes time fields
  9. subsParser := NewParser(Dom | Month | Dow)
  10. sched, err := specParser.Parse("15 */3 *")
  11. // Same as above, just makes Dow optional
  12. subsParser := NewParser(Dom | Month | DowOptional)
  13. sched, err := specParser.Parse("15 */3")
  14. func (p Parser) Parse(spec string) (Schedule, error)
  15. // ParseStandard返回一个新的crontab计划,表示给定的https://en.wikipedia.org/wiki/Cron。
  16. // 它需要5个条目,依次表示:分钟、小时、月中的日、月、星期中的日。
  17. // 如果规范无效,它将返回一个描述性错误。
  18. func ParseStandard(standardSpec string) (Schedule, error)

type Option

  1. type Option func(*Cron)
  2. // 指定作业包装器应用于添加到这个cron的所有作业
  3. func WithChain(wrappers ...JobWrapper) Option
  4. // 覆盖cron实例的时区
  5. func WithLocation(loc *time.Location) Option
  6. func WithLogger(logger Logger) Option
  7. // 覆盖用于解释作业调度的解析器
  8. func WithParser(p ScheduleParser) Option
  9. // 覆盖用于解释作业调度的解析器,以将seconds字段作为第一个字段
  10. func WithSeconds() Option

type Cron

  1. type Cron struct {
  2. // contains filtered or unexported fields
  3. }

Cron跟踪任意数量的条目,根据计划调用相关的func。可以在运行时启动、停止和检查条目
func New(opts …Option) Cron
func (c
Cron) AddFunc(spec string, cmd func()) (EntryID, error) //增加一个方法
func (c Cron) AddJob(spec string, cmd Job) (EntryID, error) //增加一个任务
func (c
Cron) Entries() []Entry //获取cron所有条目
func (c Cron) Entry(id EntryID) Entry //获取指定entryid的条目
func (c
Cron) Location() time.Location //获取时区位置
func (c
Cron) Remove(id EntryID) //删除一个任务
func (c Cron) Run() //启动+阻塞
func (c
Cron) Start() //启动
func (c *Cron) Stop() context.Context //停止(不会停止正在执行中的任务)

例子

  1. package main
  2. import (
  3. "github.com/robfig/cron"
  4. "log"
  5. )
  6. type Job struct {
  7. }
  8. func (j *Job) Run(){
  9. log.Println("Job running.....")
  10. }
  11. func main() {
  12. i := 0
  13. c := cron.New()
  14. spec := "*/5 * * * * ?"
  15. c.AddFunc(spec, func() {
  16. i++
  17. log.Println("cron running:", i)
  18. })
  19. c.AddJob(spec,&Job{})
  20. c.Run()
  21. }