wip
This commit is contained in:
28
init/cron.go
28
init/cron.go
@@ -1,7 +1,31 @@
|
||||
package init
|
||||
|
||||
import "sync"
|
||||
import (
|
||||
"os/exec"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
func (i *Init) cron(wg *sync.WaitGroup, cron Cron) {
|
||||
"gitea.suyono.dev/suyono/wingmate"
|
||||
)
|
||||
|
||||
func (i *Init) cron(wg *sync.WaitGroup, cron Cron, exitFlag <-chan any) {
|
||||
defer wg.Done()
|
||||
|
||||
ticker := time.NewTicker(time.Second * 20)
|
||||
cron:
|
||||
for {
|
||||
if cron.TimeToRun(time.Now()) {
|
||||
cmd := exec.Command(cron.Command().Path())
|
||||
if err := cmd.Run(); err != nil {
|
||||
wingmate.Log().Error().Msgf("running cron %s error %#v", cron.Command().Path(), err)
|
||||
}
|
||||
}
|
||||
|
||||
select {
|
||||
case <-exitFlag:
|
||||
ticker.Stop()
|
||||
break cron
|
||||
case <-ticker.C:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
18
init/init.go
18
init/init.go
@@ -1,8 +1,10 @@
|
||||
package init
|
||||
|
||||
import (
|
||||
"gitea.suyono.dev/suyono/wingmate"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"gitea.suyono.dev/suyono/wingmate"
|
||||
)
|
||||
|
||||
type Path interface {
|
||||
@@ -30,6 +32,7 @@ type Cron interface {
|
||||
Month() CronTimeSpec
|
||||
DayOfWeek() CronTimeSpec
|
||||
Command() Path
|
||||
TimeToRun(time.Time) bool
|
||||
}
|
||||
|
||||
type Config interface {
|
||||
@@ -58,23 +61,20 @@ func (i *Init) Start() {
|
||||
sighandlerExit = make(chan any)
|
||||
|
||||
wg = &sync.WaitGroup{}
|
||||
wg.Add(1)
|
||||
go i.waiter(wg, signalTrigger, sighandlerExit)
|
||||
|
||||
wg.Add(1)
|
||||
go i.sighandler(wg, signalTrigger, sighandlerExit)
|
||||
|
||||
for _, s := range i.config.Services() {
|
||||
wg.Add(1)
|
||||
go func(p Path) {
|
||||
for {
|
||||
if err := i.service(wg, p); err != nil {
|
||||
wingmate.Log().Error().Msgf("starting service %s error %#v", p.Path(), err)
|
||||
}
|
||||
}
|
||||
}(s)
|
||||
go i.service(wg, s, signalTrigger)
|
||||
}
|
||||
|
||||
for _, c := range i.config.Cron() {
|
||||
wg.Add(1)
|
||||
go i.cron(wg, c)
|
||||
go i.cron(wg, c, signalTrigger)
|
||||
}
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
@@ -3,19 +3,29 @@ package init
|
||||
import (
|
||||
"os/exec"
|
||||
"sync"
|
||||
|
||||
"gitea.suyono.dev/suyono/wingmate"
|
||||
)
|
||||
|
||||
func (i *Init) service(wg *sync.WaitGroup, path Path) error {
|
||||
func (i *Init) service(wg *sync.WaitGroup, path Path, exitFlag <-chan any) {
|
||||
defer wg.Done()
|
||||
|
||||
var (
|
||||
err error
|
||||
)
|
||||
|
||||
cmd := exec.Command(path.Path())
|
||||
if err = cmd.Run(); err != nil {
|
||||
return err
|
||||
service:
|
||||
for {
|
||||
cmd := exec.Command(path.Path())
|
||||
if err = cmd.Run(); err != nil {
|
||||
wingmate.Log().Error().Msgf("starting service %s error %#v", path.Path(), err)
|
||||
}
|
||||
|
||||
select {
|
||||
case <-exitFlag:
|
||||
break service
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
package init
|
||||
|
||||
import (
|
||||
"golang.org/x/sys/unix"
|
||||
"os"
|
||||
"os/signal"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
func (i *Init) sighandler(wg *sync.WaitGroup, trigger chan<- any, selfExit <-chan any) {
|
||||
defer wg.Wait()
|
||||
|
||||
isOpen := true
|
||||
|
||||
c := make(chan os.Signal, 1)
|
||||
signal.Notify(c, unix.SIGINT, unix.SIGTERM, unix.SIGCHLD)
|
||||
|
||||
@@ -19,7 +22,10 @@ signal:
|
||||
case s := <-c:
|
||||
switch s {
|
||||
case unix.SIGTERM, unix.SIGINT:
|
||||
close(trigger)
|
||||
if isOpen {
|
||||
close(trigger)
|
||||
isOpen = false
|
||||
}
|
||||
case unix.SIGCHLD:
|
||||
// do nothing
|
||||
}
|
||||
|
||||
36
init/waiter.go
Normal file
36
init/waiter.go
Normal file
@@ -0,0 +1,36 @@
|
||||
package init
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
func (i *Init) waiter(wg *sync.WaitGroup, runningFlag <-chan any, sigHandlerFlag chan<- any) {
|
||||
var (
|
||||
ws unix.WaitStatus
|
||||
// pid int
|
||||
err error
|
||||
running bool
|
||||
)
|
||||
|
||||
running = true
|
||||
wait:
|
||||
for {
|
||||
select {
|
||||
case <-runningFlag:
|
||||
running = false
|
||||
default:
|
||||
}
|
||||
|
||||
if _, err = unix.Wait4(-1, &ws, 0, nil); err != nil {
|
||||
if errors.Is(err, unix.ECHILD) {
|
||||
if !running {
|
||||
close(sigHandlerFlag)
|
||||
break wait
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user