本文详解 go 中使用 robfig/cron 库实现定时任务的正确姿势,重点解决程序启动后立即退出、cron 表达式误用及进程长期运行等常见问题,并提供可直接运行的完整示例。
在 Go 中通过 robfig/cron 执行定时方法时,一个典型误区是:调用 c.Start() 后未保持主 goroutin

此外,原始示例中的 Cron 表达式 "1 * * * * *" 实际表示「每分钟第 1 秒触发一次」(共 6 字段,支持秒级精度),而非「每秒触发」,因此 RunEverySecond 实际每分钟仅打印一次,且无任何输出感知,加剧了“未生效”的错觉。
✅ 正确做法包含三个关键点:
以下是生产就绪的完整示例:
package main
import (
"fmt"
"os"
"os/signal"
"time"
"github.com/robfig/cron/v3" // 注意:推荐使用 v3 版本(原 v1 已归档,v3 更稳定)
)
func main() {
c := cron.New()
// ✅ 每秒执行一次(6 字段秒级 cron)
c.AddFunc("* * * * * *", RunEverySecond)
// ✅ 异步启动调度器
go c.Start()
// ✅ 等待中断信号(如 Ctrl+C),防止 main 退出
sig := make(chan os.Signal, 1)
signal.Notify(sig, os.Interrupt, os.Kill)
<-sig // 阻塞在此,直到收到信号
fmt.Println("Shutting down cron scheduler...")
c.Stop() // 优雅停止(v3 支持 Stop(),v1 不支持)
}
func RunEverySecond() {
fmt.Printf("[%s] Task executed\n", time.Now().Format("15:04:05"))
}? 注意事项与最佳实践:
通过以上结构化实现,你的 Go 程序即可稳定、可控地执行周期性任务,兼具开发便捷性与生产可靠性。