Implemented job scheduler

This commit is contained in:
Eduard Urbach 2017-06-25 19:14:50 +02:00
parent fe08764b26
commit d4fbd2a090

View File

@ -3,16 +3,27 @@ package main
import ( import (
"fmt" "fmt"
"os" "os"
"os/exec"
"os/signal" "os/signal"
"path" "path"
"syscall" "syscall"
"time" "time"
"github.com/aerogo/log"
"github.com/fatih/color" "github.com/fatih/color"
) )
var colorPool = []*color.Color{
color.New(color.FgCyan),
color.New(color.FgYellow),
color.New(color.FgGreen),
color.New(color.FgBlue),
color.New(color.FgMagenta),
}
var jobs = map[string]time.Duration{ var jobs = map[string]time.Duration{
"popular-anime": 1 * time.Second, "popular-anime": 5 * time.Second,
"search-index": 15 * time.Second,
} }
func main() { func main() {
@ -24,6 +35,7 @@ func main() {
} }
func startJobs() { func startJobs() {
// Get the directory the executable is in
exe, err := os.Executable() exe, err := os.Executable()
if err != nil { if err != nil {
@ -32,22 +44,69 @@ func startJobs() {
root := path.Dir(exe) root := path.Dir(exe)
for job, interval := range jobs { // Log paths
jobInterval := interval logsPath := path.Join(root, "../", "logs")
executable := path.Join(root, job, job) jobLogsPath := path.Join(root, "../", "logs", "jobs")
os.Mkdir(jobLogsPath, 0777)
fmt.Printf("Registered job %s for execution every %v\n", color.YellowString(job), interval) // Scheduler log
mainLog := log.New()
mainLog.AddOutput(os.Stdout)
mainLog.AddOutput(log.File(path.Join(logsPath, "scheduler.log")))
schedulerLog := mainLog
// Color index
colorIndex := 0
// Start each job
for job, interval := range jobs {
jobName := job
jobInterval := interval
executable := path.Join(root, jobName, jobName)
jobColor := colorPool[colorIndex].SprintFunc()
jobLog := log.New()
jobLog.AddOutput(log.File(path.Join(jobLogsPath, jobName+".log")))
fmt.Printf("Registered job %s for execution every %v\n", jobColor(jobName), interval)
go func() { go func() {
ticker := time.NewTicker(jobInterval) ticker := time.NewTicker(jobInterval)
defer ticker.Stop() defer ticker.Stop()
var err error
for { for {
fmt.Println(executable) schedulerLog.Info("Starting " + jobColor(jobName))
cmd := exec.Command(executable)
cmd.Stdout = jobLog
cmd.Stderr = jobLog
err = cmd.Start()
if err != nil {
color.Red(err.Error())
}
err = cmd.Wait()
if err != nil {
color.Red(err.Error())
}
schedulerLog.Info("Finished " + jobColor(jobName))
jobLog.Info("--------------------------------------------------------------------------------")
<-ticker.C <-ticker.C
} }
}() }()
colorIndex = (colorIndex + 1) % len(colorPool)
} }
// Finished job registration
println("--------------------------------------------------------------------------------")
} }
func wait() { func wait() {