This commit is contained in:
2023-12-06 23:04:19 +11:00
parent a4ba011b36
commit eb7bde3cbe
10 changed files with 225 additions and 27 deletions

View File

@@ -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:
}
}
}

View File

@@ -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()
}

View File

@@ -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
}

View File

@@ -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
View 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
}
}
}
}
}