a simple and powerful crontab written in golang with web page management
golang实现的简单便捷的计划任务管理系统, 自带 web 界面,方便的管理多个任务
支持 秒,分,时,日,月,周
- go.mod
require github.com/gohouse/crontab master
package main
import (
"encoding/json"
"fmt"
"github.com/gohouse/crontab"
"github.com/gohouse/crontab/client"
"github.com/sirupsen/logrus"
"log"
"os"
"time"
)
type logFormater struct {}
func (logFormater) Format(entry *logrus.Entry) ([]byte, error) {
var marshal []byte
if len(entry.Data) > 0 {
marshal, _ = json.Marshal(entry.Data)
}
res := fmt.Sprintf("[%s] %s %s %s\n", entry.Level.String(), entry.Time.Format(time.RFC3339), entry.Message, marshal)
return []byte(res),nil
}
func main() {
var port = ":8200"
// 日志
logger := logrus.New()
// 如果使用日志文件
var logfile = "crontab.log"
f, _ := os.OpenFile(logfile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0766)
logger.SetOutput(f)
logger.SetFormatter(logFormater{})
// 如果输出到控制台,则使用 os.Stdout 即可
//logger.SetOutput(os.Stdout)
// 初始化计划任务管理器
// 这里使用了文件记录日志, 提供了logger接口, 可以自由扩充记录日志到数据库等其他地方
tm := crontab.NewTaskManager(crontab.Logger(logger))
// 加入任务列表
//TaskInit(tm)
tm.AddGroup(TaskInit)
// 开启 restful api 服务
log.Fatal(client.Run(tm, port, logfile))
}
func TaskInit(tm *crontab.TaskManager) {
// test 每10s执行一次
tm.Add("每10s执行一次", crontab.NewCronTab(crontab.CT_Second).SetSecond(10), Test)
// 每天执行一次 statistic_of_per_day
tm.Add("每天0时0分0秒执行的任务", crontab.NewCronTab(crontab.CT_Day).SetDay(1), Test)
// 30分钟执行一次
tm.Add("30分钟执行一次",
crontab.NewCronTab(crontab.CT_Minute).SetMinute(30).
RunOnceFirst(false), // 这一步操作是移除默认先执行一次,而是从30分钟后的 0s 开始周期执行第一次
Test)
}
func Test(args ...interface{}) {
// todo 这里就是你想干的事
}
访问 http://localhost:8200 即可方便的查看管理计划任务了
package main
import (
"github.com/gohouse/crontab"
"log"
)
func main() {
crontab.NewCronTab(crontab.CT_Second).
SetSecond(3).
Run(func(args ...interface{}) {
log.Println("每 3s 会执行一次本操作")
})
}
输出
2020/01/23 20:26:29 每 3s 会执行一次本操作
2020/01/23 20:26:32 每 3s 会执行一次本操作
2020/01/23 20:26:35 每 3s 会执行一次本操作
package main
import (
"fmt"
"github.com/gohouse/crontab"
"github.com/gohouse/golib/date"
"log"
"time"
)
func main() {
var job = crontab.NewTaskManager()
cron := crontab.NewCronTab(crontab.CT_Second).SetSecond(3)
cron2 := crontab.NewCronTab(crontab.CT_Second).SetSecond(3)
job.Add("xxx", cron, teststr)
job.Add("xxx222", cron2, teststrs)
log.Println("start...")
job.Start()
//go func() {
// time.Sleep(10*time.Second)
// job.Stop()
//}()
job.Wait()
}
func teststr(args ...interface{}) {
fmt.Println("xxx: ", time.Now().Format(date.DateTimeFormat))
}
func teststrs(args ...interface{}) {
fmt.Println("xxx222: ", time.Now().Format(date.DateTimeFormat))
}
GET /start
启动所有任务
GET /start/{id}
启动一个任务
GET /stop
停止所有任务
GET /stop/{id}
停止一个任务
GET /remove
删除所有任务
GET /remove/{id}
删除一个任务
GET /tasklist
任务列表
GET /log?limit=20
任务日志列表,limit为一次取最新多少条
各个缺省值为: 秒(0),分(0),时(0),日(1),周(日),月(无)
# 每3s执行一次
crontab.NewCronTab(crontab.CT_Second).SetSecond(3)
# 每分钟的第5s执行一次
crontab.NewCronTab(crontab.CT_Minute).SetMinute(1).SetSecond(5)
# 每2小时的第0分5s执行一次,缺省分钟则默认为0,下同
crontab.NewCronTab(crontab.CT_Hour).SetHour(2).SetSecond(5)
# 每3天的0点0分5s执行一次
crontab.NewCronTab(crontab.CT_Day).SetDay(3).SetSecond(5)
# 每月1号的03点05分0s执行一次,缺省日期为1号,可通过 SetDay(3) 改变日期为3号等
crontab.NewCronTab(crontab.CT_Month).SetMonth(1).SetHour(3).SetMinute(5)
# 每周周日的0点5分0s执行一次
crontab.NewCronTab(crontab.CT_Week).SetWeek(time.Sunday).SetMinute(5)
所有计划任务再运行时,都会优先执行一次,如果不想先执行一次,则可以调用RunOnceFirst(false)
即可,如
crontab.NewCronTab(crontab.CT_Second).SetSecond(3).RunOnceFirst(false)
周期任务本身不能为0,如: 按秒执行的周期不能为0s,即不能有0s的周期任务