基于cron实现定时任务

来源:互联网 发布:淘宝ued是什么意思 编辑:程序博客网 时间:2024/05/21 09:40

最近回顾了下之前的一些笔记,最近有时间总结一下子

之前的一些场景需求是要定时的执行一些任务,如周期性的执行某些程序,比如每分钟检查一下服务器上服务的运行情况或者服务器的资源情况进行上报监控,或者某一时刻执行某些任务,如在每天的零点对数据做一些统计分析等。

最开始的想法是采用goroutine来执行每个任务,通过sleep来解决周期的定时的问题(这个定时相对粗略)。后来发现了有人用go实现了Linux的Cron(github.com/robfig/cron),上面的需求也就很容易满足了。

那就先简单介绍下Cron,在Linux系统中,计划任务一般是由cron承担,我们可以把cron设置为开机时自动启动。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件),然后cron会根据命令和执行时间来按时来调用度工作任务。简而言之cron就是根据用户的配置文件,fork出相应的子进程作为守护进程来执行设置的任务。在使用时需要了解下如何根据需要生成cron表达式(当然如果不想了解也没问题,网上有现成的转换工具),下面就介绍下robfig/cron里边的表达式的规则

robfig/cron的表达式是由空格隔开的6个字段组成的一串字符串,字段描述如下

字段名称 是否必须 值范围 可用的特殊字符 Seconds Yes 0-59 */ , - Minutes Yes 0-59 */ , - Hours Yes 0-23 */ , - Day of month Yes 1-31 */ , - ? Month Yes 1-12 or JAN-DEC */ , - Day of week Yes 0-6 or SUN-SAT */ , - ?

每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:
(1) *:表示匹配该域的任意值

(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用星号,如果使用*表示不管星期几都会触发,实际上并不是这样。

(3)-:表示范围,例如5-20,表示对应域从5到20 都会触发相应的任务

(4)/:表示起始时间开始触发,然后每隔固定时间触发一次

(5) , : 表示列出枚举值值

下面是一个例子:

package mainimport (    "fmt"    "github.com/robfig/cron")func main() {    c := cron.New()    c.AddFunc("0/5 * * * * ?", func() { fmt.Printf("Hit\n") })    c.Start()    select {}}

上面的表达式就是每5秒执行一次func打印,select是不让程序退出看打印效果,然后就可以在注册的func中实现想要的定时任务就完成了。

0 0
原创粉丝点击