linux单次任务调度,go任务调度2(linux的cron调用)
cron格式:
分 時 日 月 周
每隔5分鐘執行1次: /5 * echo hello > /tmp/x.log
每隔1-5分鐘執行1次: 1-5 echo hello > /tmp/x.log
每天10點整、22點整執行1次: 0 10,22 * echo hello > /tmp/x.log
每隔1-5分鐘執行1次: 1-5 echo hello > /tmp/x.log
Parse():解析與校驗Cron表達式
Next():根據當前時間,計算下次調度時間
package main
import (
"fmt"
"github.com/gorhill/cronexpr"
"time"
)
func main() {
var (
expr *cronexpr.Expression
err error
now time.Time
nextTime time.Time
)
//每隔5分鐘執行一次(這個庫支持7位,精確到秒、年)
if expr, err = cronexpr.Parse("*/5 * * * * * *"); err != nil {
fmt.Println(err)
return
}
//當前時間
now = time.Now()
//下次調度時間
nextTime = expr.Next(now)
//等待這個定時器超時
time.AfterFunc(nextTime.Sub(now), func() {
fmt.Println("被調度了:", nextTime)
}) //下次時間減去當前時間
time.Sleep(10 * time.Second)
}
調用一個cron
輸出:被調度了: 2019-04-19 17:00:30 +0800 CST
package main
import (
"fmt"
"github.com/gorhill/cronexpr"
"time"
)
//代表一個任務
type CronJob struct {
expr *cronexpr.Expression
nextTime time.Time //expr.Next(time.Now())就可以得到下一次調度時間
}
func main() {
//需要有1個調度協程,它定時檢查所有Cron任務,誰過期了就執行誰
var (
cronJob *CronJob
expr *cronexpr.Expression
now time.Time
scheduleTable map[string] *CronJob //key:任務名字,
)
scheduleTable = make(map[string]*CronJob)
//當前時間
now = time.Now()
//定義第一個cronjob
expr = cronexpr.MustParse("*/5 * * * * * *")
cronJob = &CronJob{
expr: expr,
nextTime: expr.Next(now),
}
//任務注冊到了調度表
scheduleTable["job1"] = cronJob
//定義第二個cronjob
expr = cronexpr.MustParse("*/5 * * * * * *")
cronJob = &CronJob{
expr: expr,
nextTime: expr.Next(now),
}
//任務注冊到了調度表
scheduleTable["job2"] = cronJob
//啟動調度協程
go func() {
var (
jobName string
cronJob *CronJob
now time.Time
)
//定時檢查任務調度表是否有到期的
for {
now = time.Now()
for jobName, cronJob = range scheduleTable {
//判斷是否過期(如果下次調度時間早于等于當前時間,說明已經過期了)
if cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now) {
//啟動一個協程,執行這個任務
go func(jobName string) {
fmt.Println("執行:", jobName)
}(jobName)
//計算下一次調度時間
cronJob.nextTime = cronJob.expr.Next(now)
fmt.Println(jobName, "下次執行時間:", cronJob.nextTime)
}
}
select {
//睡眠100毫秒(不讓它占用過多cpu)
case
}
}
}()
time.Sleep(100 * time.Second)
}
調用多個cron,按時間間隔輸出:
執行: job1
job1 下次執行時間: 2019-04-19 17:31:20 +0800 CST
job2 下次執行時間: 2019-04-19 17:31:20 +0800 CST
執行: job2
執行: job1
job1 下次執行時間: 2019-04-19 17:31:25 +0800 CST
執行: job2
job2 下次執行時間: 2019-04-19 17:31:25 +0800 CST
執行: job1
job1 下次執行時間: 2019-04-19 17:31:30 +0800 CST
job2 下次執行時間: 2019-04-19 17:31:30 +0800 CST
執行: job2
......
有疑問加站長微信聯系(非本文作者)
總結
以上是生活随笔為你收集整理的linux单次任务调度,go任务调度2(linux的cron调用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux+管道+分段,Linux中sh
- 下一篇: Hive谓词解析过程分析