1掏秩、cron 表達(dá)式的基本格式
用過(guò) linux 的應(yīng)該對(duì) cron 有所了解亚亲。linux 中可以通過(guò) crontab -e 來(lái)配置定時(shí)任務(wù)廓译。不過(guò)侮穿,linux 中的 cron 只能精確到分鐘响谓。而我們這里要討論的 Go 實(shí)現(xiàn)的 cron 可以精確到秒损合,除了這點(diǎn)比較大的區(qū)別外,cron 表達(dá)式的基本語(yǔ)法是類(lèi)似的娘纷。(如果使用過(guò) Java 中的 Quartz嫁审,對(duì) cron 表達(dá)式應(yīng)該比較了解,而且它和這里我們將要討論的 Go 版 cron 很像赖晶,也都精確到秒) cron(計(jì)劃任務(wù))土居,顧名思義,按照約定的時(shí)間嬉探,定時(shí)的執(zhí)行特定的任務(wù)(job)擦耀。cron 表達(dá)式 表達(dá)了這種約定。 cron 表達(dá)式代表了一個(gè)時(shí)間集合涩堤,使用 6 個(gè)空格分隔的字段表示眷蜓。
字段名 | 是否必須 | 允許的值 | 允許的特定字符 |
---|---|---|---|
秒(Seconds) | 是 | 0-59 | * / , - |
分(Minutes) | 是 | 0-59 | * / , - |
時(shí)(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)字段的值不區(qū)分大小寫(xiě),如:SUN胎围、Sun 和 sun 是一樣的吁系。
2)星期 (Day of week)字段如果沒(méi)提供,相當(dāng)于是 *
2白魂、特殊字符說(shuō)明
1)星號(hào)(*)
表示 cron 表達(dá)式能匹配該字段的所有值汽纤。如在第5個(gè)字段使用星號(hào)(month),表示每個(gè)月
2)斜線(xiàn)(/)
表示增長(zhǎng)間隔福荸,如第1個(gè)字段(minutes) 值是 3-59/15蕴坪,表示每小時(shí)的第3分鐘開(kāi)始執(zhí)行一次,之后每隔 15 分鐘執(zhí)行一次(即 3、18背传、33呆瞻、48 這些時(shí)間點(diǎn)執(zhí)行),這里也可以表示為:3/15
3)逗號(hào)(,)
用于枚舉值径玖,如第6個(gè)字段值是 MON,WED,FRI痴脾,表示 星期一、三梳星、五 執(zhí)行
4)連字號(hào)(-)
表示一個(gè)范圍赞赖,如第3個(gè)字段的值為 9-17 表示 9am 到 5pm 直接每個(gè)小時(shí)(包括9和17)
5)問(wèn)號(hào)(?)
只用于日(Day of month)和星期(Day of week),\表示不指定值冤灾,可以用于代替 *
3前域、cron舉例說(shuō)明
每隔5秒執(zhí)行一次:*/5 * * * * ?
每隔1分鐘執(zhí)行一次:0 */1 * * * ?
每天23點(diǎn)執(zhí)行一次:0 0 23 * * ?
每天凌晨1點(diǎn)執(zhí)行一次:0 0 1 * * ?
每月1號(hào)凌晨1點(diǎn)執(zhí)行一次:0 0 1 1 * ?
在26分、29分瞳购、33分執(zhí)行一次:0 26,29,33 * * * ?
每天的0點(diǎn)话侄、13點(diǎn)、18點(diǎn)学赛、21點(diǎn)都執(zhí)行一次:0 0 0,13,18,21 * * ?
4年堆、示例
package main
import (
"github.com/robfig/cron"
"log"
)
func main() {
i := 0
c := cron.New()
spec := "*/5 * * * * ?"
c.AddFunc(spec, func() {
i++
log.Println("cron running:", i)
})
c.Start()
select{}
}
啟動(dòng)后輸出如下:
cron running : 1
cron running : 2
cron running : 3
cron running : 4
cron running : 5
但是本人在win10環(huán)境下,會(huì)報(bào)錯(cuò)
expected exactly 5 fields, found 6: [*/5 * * * * ?]
解決辦法如下:
package main
import (
"github.com/robfig/cron"
"log"
)
func newWithSecond() *cron.Cron {
secondParser := cron.NewParser(cron.Second | cron.Minute |
cron.Hour | cron.Dom | cron.Month | cron.DowOptional | cron.Descriptor)
return cron.New(cron.WithParser(secondParser), cron.WithChain())
}
func main() {
i := 0
c := newWithSecond()
spec := "*/5 * * * * ?"
_, err := c.AddFunc(spec, func() {
i++
log.Println("cron running:", i)
})
log.Println(err)
c.Start()
select {}
}