crontab 表达式解析库

VSole2022-08-03 10:37:00

什么是cronexpr

cronexpr是一个高级的crontab解析表达式的库,用于解析比原生crontab更好强大的定时任务解析器,当然,这个包是不包含定时任务功能的

安装

GO MOD模式下,执行:

$ go get github.com/gorhill/cronexpr 

案例

这个库实际上非常简单,我这里拿一个小的例子来展示一下

package main
import (
 "fmt"
 "github.com/gorhill/cronexpr"
 "log"
 "testing"
 "time"
)
func TestCron(t *testing.T) {
 _,nextTimeArr := CheckCrontabExpr("* * 10 * * * *")
 for _,v := range nextTimeArr{
  fmt.Println(v)
 }
}
func CheckCrontabExpr(crontabs string) (err error, nextTimeArr []string) {
 var nextTime []time.Time
 if _, err = cronexpr.Parse(crontabs); err != nil {
  log.Fatal(err)
  return err, nil
 }
 //返回当前crontab后的5次执行,n为次数
 nextTime = cronexpr.MustParse(crontabs).NextN(time.Now(), 5)
 for _, v := range nextTime {
  nextTimeArr = append(nextTimeArr, v.String())
 }
 return nil, nextTimeArr
}

上面的例子是打印这个crontab表达式“* * 10 * * * *”的后五次执行时间,结果如下:

=== RUN   TestCron
2021-04-27 10:00:00 +0800 CST
2021-04-27 10:00:01 +0800 CST
2021-04-27 10:00:02 +0800 CST
2021-04-27 10:00:03 +0800 CST
2021-04-27 10:00:04 +0800 CST
--- PASS: TestCron (0.01s)
PASS

由于这个crontab表达式的最小粒度是秒,所以我们如果要自己写一个定时任务的话,可以用:

for{
    var now = time.now()
    nextDoCron := cronexpr.MustParse("* * 10 * * * *").Next(now)
 if cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now) 
    ......
    ......
 select {
  case <-time.NewTimer(1 * time.Second).C:
 }
}

这样就只需要每秒检查一次,nextDoCron变量就是根据当前时间time.now()获取到的下一次执行时间

判断过期了或者刚好过期时,则执行if中的内容即可做到定时任务的功效

他的crontab表达式支持非常多的定义,这里我写个自己的总结:

/**
 创建时间:2020-07-08 11:18:24
 根据传入的表达式,检查表达式是否正确:
      字段名       是否强制      支持的格式      支持的特殊格式
 ----------     ----------   --------------    --------------------
 Seconds        No           0-59              * / , -
 Minutes        Yes          0-59              * / , -
 Hours          Yes          0-23              * / , -
 Day of month   Yes          1-31              * / , - L W (L指最后last,若用L,表示月底,W指的是最近的工作日)
 Month          Yes          1-12 or JAN-DEC   * / , -
 Day of week    Yes          0-6 or SUN-SAT    * / , - L # (L指最后last,若用1L,表示本月最后一周的周一)
 Year           No           1970–2099         * / , -
 
 00 */10 08-19 * * * * * 从08点到19点,每10分钟执行一次
 2021-04-27 08:00:00 +0800 CST
 2021-04-27 08:10:00 +0800 CST
 2021-04-27 08:20:00 +0800 CST
 2021-04-27 08:30:00 +0800 CST
 2021-04-27 08:40:00 +0800 CST
 
 00 00 17 * * 1-5 * 我们公司点加班餐的定时任务推送消息 周一到周五,每天的17点推送一次
 2021-04-27 17:00:00 +0800 CST
 2021-04-28 17:00:00 +0800 CST
 2021-04-29 17:00:00 +0800 CST
 2021-04-30 17:00:00 +0800 CST
 2021-05-03 17:00:00 +0800 CST
 
*/

总结

cronexpr库实际上解决了我们自己去解析表达式的苦,我记得之前我用PHP写过一版crontab表达式解析,那叫一个心惊胆战,生怕自己写错造成生产事故,定时任务有很多种实现方式,这个库只是为我们解决了最基本也是最关键的表达式解析,推荐给大家,可以看看源码哟~

crontabcst
本作品采用《CC 协议》,转载必须注明作者和本文链接
crontab 表达式解析库
2022-08-03 10:37:00
什么是cronexprcronexpr是一个高级的crontab解析表达式的库,用于解析比原生crontab更好强大的定时任务解析器,当然,这个包是不包含定时任务功能的安装GO MOD模式下,执行:$?案例这个库实际上非常简单,我这里拿一个小的例子来展示一下package?//返回当前crontab后的5次执行,n为次数
└─50-After-systemd-logind\x2eservice.conf, 50-After-systemd-user-sessions\x2eservice.conf, 50-Description.conf, 50-SendSIGHUP.conf, 50-Slice.conf, 50-TasksMax.con. Active: active since 一 2021-07-12 10:05:01 CST; 4h 52min ago. 真不巧,看起来不是注册到 systemd 的,那么是谁拉起来的呢?啊,是 crontab非常不巧,我当时一心想找是哪个 service,没注意到 crontab 的存在,还以为上次的那个挖矿木马换了个 service 的名字,还去这个路径找了好久,找了半天也没有看到恶意的 service 啊突然想到我还没看 crontab于是打开crontab发现了一条指令他静静的呆在那里像是在嘲笑我太菜了,这个套路都没注意到 :P于是,注释掉这行,然后对着刚刚 systemd 输出的三个进程一顿 kill ├─2075 tOAK5Ejl
└─50-After-systemd-logind\x2eservice.conf, 50-After-systemd-user-sessions\x2eservice.conf, 50-Description.conf, 50-SendSIGHUP.conf, 50-Slice.conf, 50-TasksMax.con. Active: active since 一 2021-07-12 10:05:01 CST; 4h 52min ago. 真不巧,看起来不是注册到 systemd 的,那么是谁拉起来的呢?啊,是 crontab非常不巧,我当时一心想找是哪个 service,没注意到 crontab 的存在,还以为上次的那个挖矿木马换了个 service 的名字,还去这个路径找了好久,找了半天也没有看到恶意的 service 啊突然想到我还没看 crontab于是打开crontab发现了一条指令他静静的呆在那里像是在嘲笑我太菜了,这个套路都没注意到 :P于是,注释掉这行,然后对着刚刚 systemd 输出的三个进程一顿 kill├─2075 tOAK5Ejl
实战 | 挖矿木马排查
2023-02-22 10:05:36
└─50-After-systemd-logind\x2eservice.conf, 50-After-systemd-user-sessions\x2eservice.conf, 50-Description.conf, 50-SendSIGHUP.conf, 50-Slice.conf, 50-TasksMax.con. Active: active since 一 2021-07-12 10:05:01 CST; 4h 52min ago. 真不巧,看起来不是注册到 systemd 的,那么是谁拉起来的呢?啊,是 crontab非常不巧,我当时一心想找是哪个 service,没注意到 crontab 的存在,还以为上次的那个挖矿木马换了个 service 的名字,还去这个路径找了好久,找了半天也没有看到恶意的 service 啊突然想到我还没看 crontab于是打开crontab发现了一条指令他静静的呆在那里像是在嘲笑我太菜了,这个套路都没注意到 :P于是,注释掉这行,然后对着刚刚 systemd 输出的三个进程一顿 kill├─2075 tOAK5Ejl
Apache ActiveMQ是最流行的开源、多协议、基于 Java 的消息代理。它支持行业标准协议,用户可以从多种语言和平台的客户端使用AMQP协议集成多平台应用程序。
网络拓扑场景介绍局域网下含有物理机、proxy server主机。物理机即普通客户主机,proxy server即企业提供的代理,此网络模拟的是公网环境。
安装Linux系统最小化,即选包最小化,yum安装软件包也要最小化,无用的包不装。开机自启动服务最小化,即无用的服务不开启。Linux系统文件及目录的权限设置最小化,禁止随意创建、更改、删除文件。在生产环境中,删除多余的账户信息。
本篇文章是WebLogic中间件漏洞复现,记录了近几年来爆出的WebLogic中间件漏洞主要分为六个部分:WebLogic简介、WebLogic安装、WebLogic漏洞复现、WebLogic SSRF联动Redis、WebLogic实战和WebLogic防御措施。
WebLogic是由美国Oracle公司出品的一application server,准确的说就是一个基于JAVAEE而开发的一个中间件,类似Tomcat,WebLogic是一个用于开发,集成,部署与管理大型分布式Web应用,网络应用和数据库的java应用服务器。将java动态功能与java Enterprise标准的安全性引入大型网络应用的开发,集成,部署与管理之中。
VSole
网络安全专家