英文:
Is there a way to invoke a cron job on a certain date/time?
问题
我正在使用似乎是最受欢迎的 cron 包,作者是 robfig:https://godoc.org/github.com/robfig/cron。目前我知道可以使用以下代码来调用每小时的 cron 作业:
c.AddFunc("@hourly", func() { fmt.Println("Every hour") })
然而,我想知道是否可以设置它只在 2017 年 9 月 1 日之后开始运行?如果使用该包无法实现,还有其他方法可以实现吗?谢谢。
英文:
I am using what seems to be the most popular cron package by robfig: https://godoc.org/github.com/robfig/cron. Currently I know that I can invoke an hourly cron job with:
c.AddFunc("@hourly", func() { fmt.Println("Every hour") })
However I wonder if it is possible to set it so that it only starts after (for example) Sep 1st, 2017? If it's not possible using that package, how else can I achieve that? Thanks.
答案1
得分: 2
如果您想要自定义调度,可以实现自己的调度器(scheduler),然后使用Cron.Schedule注册作业(job)。以下是一个在一定时间后重复执行CRON作业的示例实现:
package main
import (
"fmt"
"time"
"github.com/robfig/cron"
)
type MyScheduler struct {
At time.Time
Every time.Duration
}
func (s *MyScheduler) Next(t time.Time) time.Time {
if t.After(s.At) {
return t.Add(s.Every)
}
return s.At
}
func main() {
c := cron.New()
// 在一定时间后每2秒执行一次(从现在开始5秒后)
now := time.Now()
at := now.Add(5 * time.Second) // 在您的情况下,这应该是:2017年9月1日
s := &MyScheduler{at, 2 * time.Second}
c.Schedule(s, cron.FuncJob(
func() {
cur := time.Now()
fmt.Printf(" [%v] CRON job executed after %v\n", cur, cur.Sub(now))
}))
fmt.Printf("Now: %v\n", now)
c.Start()
time.Sleep(10 * time.Second)
c.Stop()
}
以上代码是一个使用CRON库实现的示例,它会在指定时间后每2秒执行一次作业。您可以根据自己的需求进行修改和定制。
英文:
If you want a custom scheduling, implements your own scheduler, then register the job using Cron.Schedule. Below is an example implementation of repeating a CRON job after a certain time:
package main
import (
"fmt"
"time"
"github.com/robfig/cron"
)
type MyScheduler struct {
At time.Time
Every time.Duration
}
func (s *MyScheduler) Next(t time.Time) time.Time {
if t.After(s.At) {
return t.Add(s.Every)
}
return s.At
}
func main() {
c := cron.New()
//Execute every 2 seconds after a certain time (5 second from now)
now := time.Now()
at := now.Add(5 * time.Second) //In your case, this should be: Sep 1st, 2017
s := &MyScheduler{at, 2 * time.Second}
c.Schedule(s, cron.FuncJob(
func() {
cur := time.Now()
fmt.Printf(" [%v] CRON job executed after %v\n", cur, cur.Sub(now))
}))
fmt.Printf("Now: %v\n", now)
c.Start()
time.Sleep(10 * time.Second)
c.Stop()
}
答案2
得分: 1
添加到@Adrians评论中,
包robfig/cron支持cron表达式格式。要在每个小时的30分钟后运行cron,即上午9:30、10:30、11:30,您可以使用以下代码:
c.AddFunc("0 30 * * * *", func() {})
以下是一个示例实现,使cron在2017年9月1日之后运行:
package main
import (
"fmt"
"time"
"github.com/robfig/cron"
)
func main() {
// 将时间设置为2017年9月1日00:00 UTC
t := time.Date(2017, time.September, 1, 0, 0, 0, 0, time.UTC)
c := cron.New()
// 使用cron表达式格式,使函数每小时在半小时时运行
c.AddFunc("0 30 * * * *", func() {
if time.Now().After(t) {
fmt.Println("yay")
// 插入逻辑块
}
})
// 启动cron调度器
c.Start()
// 等待程序结束
select {}
}
注意:此包使用的cron表达式格式与标准的Unix cron格式不同。该包使用的表达式格式允许秒级精度,而不像Unix cron格式。
英文:
Adding to @Adrians Comments,
The package robfig/cron supports cron expression format. To have the cron run 30 mins past every hour viz on 9:30 am,10:30 am, 11:30 am. You could use
> c.AddFunc("0 30 * * * *", func() {})
an implementation to have the cron run after Sep 1, 2017
package main
import (
"fmt"
"time"
"github.com/robfig/cron"
)
func main() {
// time set to Sep 1, 2017 00:00 Hours UTC
t := time.Date(2017, time.September, 1, 0, 0, 0, 0, time.UTC)
c := cron.New()
//using cron expression format to have the function run every hour on the half hour
c.AddFunc("0 30 * * * *", func() {
if time.Now.After(t){
fmt.Println("yay")
//insert logic block
}
})
}
Note: The cron expression format used by this package is different from the standard unix cron format. The expression format used by this package allows for second precision unlike unix cron format.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论