scheduler.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package scheduler
  2. import (
  3. "context"
  4. "log"
  5. "time"
  6. "github.com/robfig/cron/v3"
  7. "go.uber.org/zap"
  8. "fwh-toolbox-server/services"
  9. "fwh-toolbox-server/utils/agentfiles"
  10. )
  11. func Init() *cron.Cron {
  12. c := cron.New()
  13. // UTC时间 23点55分 定时任务
  14. c.AddFunc("CRON_TZ=UTC 0 23 * * *", func() {
  15. log.Println("run at UTC midnight:", time.Now().UTC())
  16. log.Println("run at Local midnight:", time.Now())
  17. // SIM卡每日信息更新任务
  18. // err := task.CreateTaskSimCardCollect()
  19. // if err != nil {
  20. // zap.L().Error("CreateTaskSimCardCollect failed.", zap.String("err", err.Error()), zap.String("time(UTC)", time.Now().UTC().Format(time.DateTime)))
  21. // }
  22. })
  23. // c.AddFunc("@every 1h", func() {
  24. // log.Println("每小时任务执行")
  25. // // do job
  26. // })
  27. c.AddFunc("30 10 * * *", func() {
  28. log.Println("每天10:30任务执行")
  29. // do job
  30. })
  31. c.AddFunc("10 12 * * *", func() {
  32. log.Println("每天12:10任务执行")
  33. // do job
  34. })
  35. // 告警统计任务,每天上午5点
  36. c.AddFunc("0 5 * * *", func() {
  37. log.Println("告警统计任务,每天5:00任务执行")
  38. // do job
  39. })
  40. // 每天 14:00 执行一次
  41. // robfig/cron 默认支持 6 字段:秒 分 时 日 月 星期
  42. // "0 0 14 * * *" 秒=0, 分=0, 时=14,每天执行
  43. c.AddFunc("35 15 * * *", func() {
  44. log.Println("每天 15:35 执行Shutdown统计")
  45. // 获取当前时间
  46. // now := time.Now()
  47. // 计算前天(往前两天)
  48. // beforeYesterday := now.AddDate(0, 0, -2)
  49. // 格式化为字符串(按 yyyy-MM-dd)
  50. // beforeYesterdayStr := beforeYesterday.Format(time.DateOnly)
  51. // TODO 暂停每日任务
  52. // taskQueue.EnqueueShutdownStatisticsTask(domain.TaskShutdownStatistics{
  53. // Date: beforeYesterdayStr,
  54. // })
  55. })
  56. // 每小时清理 MCP Agent 本地落盘目录(/tmp/fwh-toolbox-agent 下 results/、downloads/)
  57. // 中 mtime 超过 24h 的过期文件。MCP 是本机子进程、与后端共享 /tmp,故可在此统一清理。
  58. // 与 MCP 进程启动时的清理(A 方案)互为补充,覆盖长期不重启的常驻场景。
  59. c.AddFunc("@every 1h", func() {
  60. res := agentfiles.Cleanup(agentfiles.DefaultMaxAge)
  61. zap.L().Debug("agent 落盘目录清理",
  62. zap.Int("scanned", res.Scanned),
  63. zap.Int("removed", res.Removed),
  64. zap.Int("failed", res.Failed),
  65. zap.Int64("freedBytes", res.Freed),
  66. )
  67. })
  68. c.AddFunc("@every 1h", func() {
  69. if err := services.CleanupDataDownloadPackages(context.Background()); err != nil {
  70. zap.L().Error("DataDownload package cleanup failed", zap.String("err", err.Error()))
  71. }
  72. if err := services.CleanupDataDownloadArtifacts(context.Background()); err != nil {
  73. zap.L().Error("DataDownload artifact cleanup failed", zap.String("err", err.Error()))
  74. }
  75. })
  76. c.Start()
  77. // 打印任务计划表
  78. entries := c.Entries()
  79. var entriesStr []string
  80. for _, i := range entries {
  81. entriesStr = append(entriesStr, i.Next.Format(time.DateTime))
  82. }
  83. zap.L().Debug("cron entries", zap.Any("entries", entriesStr))
  84. return c
  85. }