前言
linux自带的crontab默认情况下只能精确到分钟,没法执行秒级任务。当然,也不是不行,比如:
* * * * * for i in $(seq 1 11);do echo hello >> /home/heruos/tmp.txt;sleep 5;done
看起来low了点,但也不是不能用。本文推荐go的一个第三方模块——gocron,配置定时任务也相当简单。
- 安装
go get -u github.com/go-co-op/gocron
基础使用示例
package main import ( "fmt" "time" "github.com/go-co-op/gocron" ) func cron1() { fmt.Println(time.Now().Format("2006-01-02 15:04:05")) } func main() { timezone,_ := time.LoadLocation("Asia/Shanghai") s := gocron.NewScheduler(timezone) // 每3秒执行一次 s.Every(3).Seconds().Do(cron1) s.StartBlocking() }
定时示例
// 每5秒执行一次 s.Every(5).Seconds().Do(func(){ ... }) // 每5天执行 s.Every(5).Days().Do(func(){ ... }) // 解析字符串。每5秒执行 s.Every("5s").Do(cron2) // 每月1号、2号和3号的10:00执行一次 s.Every(1).Month(1,2,3).At("10:00").Do(func(){ ... }) // 每天10:30执行一次 s.Every(1).Day().At("10:30").Do(func(){ ... }) // 每天10:30和08:00执行一次 s.Every(1).Day().At("10:30;08:00").Do(func(){ ... }) // 解析crontab表达式,每分钟执行一次 s.Cron("* * * * *").Do(func(){ ... })
启动方式
启动scheduler
有两种方式:
s.StartAsync()
:异步调用,适合集成到其它系统。s.StartBlocking()
:阻塞调用,适合单纯的定时任务场景。