1.介绍
在Linux
中,通过crontab
命令使任务在约定的时间执行已经计划好的工作,而Go
由于语言的特性,不适合直接使用crontab
来管理计划任务,cron (目前 Star8.3k)是一个用Go
实现的定时任务库,支持秒级定时任务,可以满足绝大多数工作场景需求。
2. 安装
go get github.com/robfig/cron/v3@v3.0.0
复制
3. 快速使用
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func main() {
// 开启秒字段支持
c := cron.New(cron.WithSeconds())
// 传统表达式写法: 每秒执行一次
_, _ = c.AddFunc("0/1 * * * * *", func() {
fmt.Println("传统表达式: ",time.Now().Format("2006-01-02 15:04:05"))
})
// 预定义表达式
_,_ = c.AddFunc("@every 1s", func() {
fmt.Println("预定义表达式: ",time.Now().Format("2006-01-02 15:04:05"))
})
// 启动
c.Start()
// 防止程序直接退出
time.Sleep(time.Second * 3)
}
/**输出
预定义表达式: 2021-07-18 10:44:52
传统表达式: 2021-07-18 10:44:52
传统表达式: 2021-07-18 10:44:53
预定义表达式: 2021-07-18 10:44:53
传统表达式: 2021-07-18 10:44:54
预定义表达式: 2021-07-18 10:44:54
*/复制
4. 添加任务方式
4.1 通过AddFunc
具体使用,参见上面的快速使用案例
4.2 通过AddJob
1. 使用步骤
第一步:定义类型 第二步:实现 cron.Job
接口,即给自定义类型添加方法Run()
第三步:通过 AddJob
方法添加到定时任务
2. 使用示例
package main
import (
"fmt"
"github.com/robfig/cron/v3"
"time"
)
// 定义类型
type city struct {
Name string
}
// 实现cron.Job接口
func (s city) Run() {
fmt.Printf("%s时间:%v\n",s.Name,time.Now().Format("2006-01-02 15:04:05"))
}
func main() {
// 开启秒级别支持,默认支持最小粒度是分钟
c := cron.New(cron.WithSeconds())
// 添加定时任务
_, _ = c.AddJob("@every 1s", city{
Name: "北京",
})
// 启动
c.Start()
// 防止程序直接退出
for {}
}
/**输出
北京时间:2021-07-18 11:21:50
北京时间:2021-07-18 11:21:51
北京时间:2021-07-18 11:21:52
...
*/复制
5. 执行频率
5.1 cron时间表达式
@注意: cron默认支持最小粒度是分钟,若要支持秒级别,需要传入cron.WithSeconds()
来开启,开启后的cron时间表达式和Linux中的crontab时间表达式会有区别。
1. 开启秒级别后

2. 示例
@注意:下面表格示例,是在开启秒级级别支持情况下的写法。
表达式 | 说明 |
---|---|
* * * * * * | 每秒执行一次 |
0 */1 * * * * | 每分钟执行一次 |
0 0 */1 * * * | 每小时执行一次 |
0 0 0 */1 * * | 每天00:00 执行一次 |
0 30 23 */1 * * | 每天23:30 执行一次 |
0 0 0 1 */1 * | 每月的第一天执行 |
0 30 21 * * 1 | 每周一21:30 执行 |
5.2 预定义时间
1. 预表达式
上面通过表达式写,很容易会写错,还好cron
提供了预表达式,可以很方便各种场景的示例,具体如下:
表达式 | 描述 | 等式 |
---|---|---|
@yearly (or @annually) | 每年1月1日 00:00:00 执行一次 | 0 0 0 1 1 * |
@monthly | 每个月第一天的 00:00:00 执行一次 | 0 0 0 1 * * |
@weekly | 每周周六的 00:00:00 执行一次 | 0 0 0 * * 0 |
@daily (or @midnight) | 每天 00:00:00 执行一次 | 0 0 0 * * * |
@hourly | 每小时执行一次 | 0 0 * * * * |
@every duration | 指定时间间隔执行一次,如 @every 5s ,每隔5秒执行一次。 | 0/5 * * * * * |
2. 固定间隔(@every
)
@every duration
含义为每隔duration
触发一次。<duration>
会调用time.ParseDuration()
函数解析,所以ParseDuration
支持的格式都可以。单位为h(小时)、m(分钟)、s(秒)
表达式 | 说明 |
---|---|
@every 1s | 每秒钟执行一次 |
@every 1m | 每分钟执行一次 |
@every 1h | 每小时执行一次 |
@every 1h1m | 每小时一分钟执行一次 |
文章转载自猿码记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
数据库国产化替代深化:DBA的机遇与挑战
代晓磊
1224次阅读
2025-04-27 16:53:22
2025年4月国产数据库中标情况一览:4个千万元级项目,GaussDB与OceanBase大放异彩!
通讯员
690次阅读
2025-04-30 15:24:06
国产数据库需要扩大场景覆盖面才能在竞争中更有优势
白鳝的洞穴
576次阅读
2025-04-14 09:40:20
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
496次阅读
2025-04-17 17:02:24
一页概览:Oracle GoldenGate
甲骨文云技术
472次阅读
2025-04-30 12:17:56
GoldenDB数据库v7.2焕新发布,助力全行业数据库平滑替代
GoldenDB分布式数据库
466次阅读
2025-04-30 12:17:50
优炫数据库成功入围新疆维吾尔自治区行政事业单位数据库2025年框架协议采购!
优炫软件
356次阅读
2025-04-18 10:01:22
国产数据库图谱又上新|82篇精选内容全览达梦数据库
墨天轮编辑部
269次阅读
2025-04-23 12:04:21
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
数据库运维之道
249次阅读
2025-04-28 11:01:25
给准备学习国产数据库的朋友几点建议
白鳝的洞穴
240次阅读
2025-05-07 10:06:14