feat(experiment/bg): added bg utility to help pid proxy testing
feat(experiment/starter): added option to skip waiting for child process
This commit is contained in:
parent
7db6f6f8f3
commit
a0134fa400
7
Makefile
7
Makefile
|
@ -3,7 +3,7 @@ DESTDIR = /usr/local/bin
|
|||
installs = install-dir
|
||||
programs = wingmate pidproxy exec
|
||||
ifdef TEST_BUILD
|
||||
programs += oneshot spawner starter dummy
|
||||
programs += oneshot spawner starter dummy bg
|
||||
installs += install-test
|
||||
endif
|
||||
|
||||
|
@ -30,6 +30,9 @@ spawner:
|
|||
starter:
|
||||
$(MAKE) -C cmd/experiment/starter all
|
||||
|
||||
bg:
|
||||
$(MAKE) -C cmd/experiment/bg all
|
||||
|
||||
clean:
|
||||
$(MAKE) -C cmd/wingmate clean
|
||||
$(MAKE) -C cmd/pidproxy clean
|
||||
|
@ -38,6 +41,7 @@ clean:
|
|||
$(MAKE) -C cmd/experiment/oneshot clean
|
||||
$(MAKE) -C cmd/experiment/spawner clean
|
||||
$(MAKE) -C cmd/experiment/starter clean
|
||||
$(MAKE) -C cmd/experiment/bg clean
|
||||
|
||||
install: ${installs}
|
||||
$(MAKE) -C cmd/wingmate DESTDIR=${DESTDIR} install
|
||||
|
@ -49,6 +53,7 @@ install-test:
|
|||
$(MAKE) -C cmd/experiment/oneshot DESTDIR=${DESTDIR} install
|
||||
$(MAKE) -C cmd/experiment/spawner DESTDIR=${DESTDIR} install
|
||||
$(MAKE) -C cmd/experiment/starter DESTDIR=${DESTDIR} install
|
||||
$(MAKE) -C cmd/experiment/bg DESTDIR=${DESTDIR} install
|
||||
|
||||
install-dir:
|
||||
install -d ${DESTDIR}
|
||||
|
|
|
@ -5,4 +5,5 @@
|
|||
/oneshot/oneshot
|
||||
/oneshot/version.txt
|
||||
/spawner/spawner
|
||||
/spawner/version.txt
|
||||
/spawner/version.txt
|
||||
/bg/bg
|
|
@ -0,0 +1,10 @@
|
|||
all:
|
||||
git describe > version.txt
|
||||
go build -v
|
||||
|
||||
clean:
|
||||
echo "dev" > version.txt
|
||||
go clean -i -cache -testcache
|
||||
|
||||
install:
|
||||
install bg ${DESTDIR}/wmbg
|
|
@ -0,0 +1,67 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/spf13/pflag"
|
||||
"golang.org/x/sys/unix"
|
||||
)
|
||||
|
||||
const (
|
||||
logPathFlag = "log-path"
|
||||
pidFileFlag = "pid-file"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var (
|
||||
logPath string
|
||||
pidFilePath string
|
||||
name string
|
||||
pause uint
|
||||
lf *os.File
|
||||
err error
|
||||
)
|
||||
|
||||
pflag.StringVarP(&logPath, logPathFlag, "l", "/var/log/wmbg.log", "log file path")
|
||||
pflag.StringVarP(&pidFilePath, pidFileFlag, "p", "/var/run/wmbg.pid", "pid file path")
|
||||
pflag.StringVar(&name, "name", "no-name", "process name")
|
||||
pflag.UintVar(&pause, "pause", 5, "pause interval")
|
||||
pflag.Parse()
|
||||
|
||||
if lf, err = os.OpenFile(logPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644); err != nil {
|
||||
os.Exit(2)
|
||||
}
|
||||
defer func() {
|
||||
_ = lf.Close()
|
||||
}()
|
||||
|
||||
log.SetOutput(lf)
|
||||
log.Printf("starting process %s with pause interval %d", name, pause)
|
||||
if err = writePid(pidFilePath); err != nil {
|
||||
log.Printf("failed to write pid file: %+v", err)
|
||||
}
|
||||
time.Sleep(time.Duration(pause) * time.Second)
|
||||
log.Printf("process %s finished", name)
|
||||
}
|
||||
|
||||
func writePid(path string) error {
|
||||
var (
|
||||
err error
|
||||
pf *os.File
|
||||
)
|
||||
|
||||
if pf, err = os.OpenFile(path, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644); err != nil {
|
||||
return fmt.Errorf("opening pid file for write: %w", err)
|
||||
}
|
||||
defer func() {
|
||||
_ = pf.Close()
|
||||
}()
|
||||
|
||||
if _, err = fmt.Fprintf(pf, "%d", unix.Getpid()); err != nil {
|
||||
return fmt.Errorf("writing pid to the pid file: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
dev
|
|
@ -4,55 +4,90 @@ import (
|
|||
"bufio"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"sync"
|
||||
|
||||
"gitea.suyono.dev/suyono/wingmate"
|
||||
"gitea.suyono.dev/suyono/wingmate/cmd/cli"
|
||||
"github.com/spf13/pflag"
|
||||
"github.com/spf13/viper"
|
||||
)
|
||||
|
||||
const (
|
||||
// DummyPath = "/workspaces/wingmate/cmd/experiment/dummy/dummy"
|
||||
DummyPath = "/usr/local/bin/wmdummy"
|
||||
EnvDummyPath = "DUMMY_PATH"
|
||||
NoWaitFlag = "no-wait"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var (
|
||||
stdout io.ReadCloser
|
||||
stderr io.ReadCloser
|
||||
wg *sync.WaitGroup
|
||||
err error
|
||||
exePath string
|
||||
stdout io.ReadCloser
|
||||
stderr io.ReadCloser
|
||||
wg *sync.WaitGroup
|
||||
err error
|
||||
exePath string
|
||||
selfArgs []string
|
||||
childArgs []string
|
||||
flagSet *pflag.FlagSet
|
||||
noWait bool
|
||||
cmd *exec.Cmd
|
||||
)
|
||||
if selfArgs, childArgs, err = cli.SplitArgs(os.Args); err == nil {
|
||||
flagSet = pflag.NewFlagSet(selfArgs[0], pflag.ExitOnError)
|
||||
flagSet.Bool(NoWaitFlag, false, "do not wait for the child process")
|
||||
if err = flagSet.Parse(selfArgs[1:]); err != nil {
|
||||
log.Printf("invalid argument: %+v", err)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
flagSet = pflag.NewFlagSet(os.Args[0], pflag.ExitOnError)
|
||||
flagSet.Bool(NoWaitFlag, false, "do not wait for the child process")
|
||||
if err = flagSet.Parse(selfArgs[1:]); err != nil {
|
||||
log.Printf("invalid argument: %+v", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
viper.BindPFlag(NoWaitFlag, flagSet.Lookup(NoWaitFlag))
|
||||
noWait = viper.GetBool(NoWaitFlag)
|
||||
|
||||
viper.SetEnvPrefix(wingmate.EnvPrefix)
|
||||
viper.BindEnv(EnvDummyPath)
|
||||
viper.SetDefault(EnvDummyPath, DummyPath)
|
||||
|
||||
exePath = viper.GetString(EnvDummyPath)
|
||||
|
||||
cmd := exec.Command(exePath)
|
||||
|
||||
if stdout, err = cmd.StdoutPipe(); err != nil {
|
||||
log.Panic(err)
|
||||
if len(childArgs) > 0 {
|
||||
cmd = exec.Command(childArgs[0], childArgs[1:]...)
|
||||
} else {
|
||||
cmd = exec.Command(exePath)
|
||||
}
|
||||
|
||||
if stderr, err = cmd.StderrPipe(); err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
if !noWait {
|
||||
if stdout, err = cmd.StdoutPipe(); err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
|
||||
wg = &sync.WaitGroup{}
|
||||
wg.Add(2)
|
||||
go pulley(wg, stdout, "stdout")
|
||||
go pulley(wg, stderr, "stderr")
|
||||
if stderr, err = cmd.StderrPipe(); err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
|
||||
wg = &sync.WaitGroup{}
|
||||
wg.Add(2)
|
||||
go pulley(wg, stdout, "stdout")
|
||||
go pulley(wg, stderr, "stderr")
|
||||
}
|
||||
|
||||
if err = cmd.Start(); err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
wg.Wait()
|
||||
|
||||
if err = cmd.Wait(); err != nil {
|
||||
log.Printf("got error when Waiting for child process: %#v\n", err)
|
||||
if !noWait {
|
||||
wg.Wait()
|
||||
|
||||
if err = cmd.Wait(); err != nil {
|
||||
log.Printf("got error when Waiting for child process: %#v\n", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue