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:
2024-03-28 00:20:45 +00:00
parent 7db6f6f8f3
commit a0134fa400
6 changed files with 141 additions and 22 deletions

View File

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