前言
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()
:阻塞調用,適合單純的定時任務場景。