restic-scheduler/scheduler.go

56 lines
871 B
Go
Raw Normal View History

package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"github.com/robfig/cron/v3"
)
func ScheduleAndRunJobs(jobs []Job) error {
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT,
)
runner := cron.New()
for _, job := range jobs {
fmt.Println("Scheduling", job.Name)
if _, err := runner.AddJob(job.Schedule, job); err != nil {
return fmt.Errorf("Error scheduling job %s: %w", job.Name, err)
}
}
runner.Start()
switch <-signalChan {
case syscall.SIGINT:
fmt.Println("Stopping now...")
defer runner.Stop()
return nil
case syscall.SIGTERM:
fallthrough
case syscall.SIGQUIT:
// Wait for all jobs to complete
fmt.Println("Stopping after running jobs complete...")
defer func() {
ctx := runner.Stop()
<-ctx.Done()
}()
return nil
}
return nil
}