fix(init): removed unnecessary error message when waiting for child process; race with wait all
fix(exec): fallback to os.Args when no delimiter found fix(pidproxy): fallback to os.Args when no delimiter found fix(splitargs): return full selfArgs fix(experiment/starter): replaced bool no-wait with count test(docker/bookworm-newconfig): added test for background process + pid proxy
This commit is contained in:
parent
a0134fa400
commit
f2bfd6e60b
@ -23,7 +23,7 @@ func SplitArgs(args []string) ([]string, []string, error) {
|
|||||||
return nil, nil, errors.New("invalid argument")
|
return nil, nil, errors.New("invalid argument")
|
||||||
}
|
}
|
||||||
|
|
||||||
selfArgs = args[1:i]
|
selfArgs = args[:i]
|
||||||
childArgs = args[i+1:]
|
childArgs = args[i+1:]
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@ -71,11 +71,13 @@ func main() {
|
|||||||
|
|
||||||
app.version.Cmd(rootCmd)
|
app.version.Cmd(rootCmd)
|
||||||
|
|
||||||
selfArgs, childArgs, err = cli.SplitArgs(os.Args)
|
if selfArgs, childArgs, err = cli.SplitArgs(os.Args); err != nil {
|
||||||
|
selfArgs = os.Args
|
||||||
|
}
|
||||||
app.childArgs = childArgs
|
app.childArgs = childArgs
|
||||||
app.err = err
|
app.err = err
|
||||||
|
|
||||||
rootCmd.SetArgs(selfArgs)
|
rootCmd.SetArgs(selfArgs[1:])
|
||||||
if err := rootCmd.Execute(); err != nil {
|
if err := rootCmd.Execute(); err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|||||||
@ -35,24 +35,26 @@ func main() {
|
|||||||
)
|
)
|
||||||
if selfArgs, childArgs, err = cli.SplitArgs(os.Args); err == nil {
|
if selfArgs, childArgs, err = cli.SplitArgs(os.Args); err == nil {
|
||||||
flagSet = pflag.NewFlagSet(selfArgs[0], pflag.ExitOnError)
|
flagSet = pflag.NewFlagSet(selfArgs[0], pflag.ExitOnError)
|
||||||
flagSet.Bool(NoWaitFlag, false, "do not wait for the child process")
|
flagSet.Count(NoWaitFlag, "do not wait for the child process")
|
||||||
if err = flagSet.Parse(selfArgs[1:]); err != nil {
|
if err = flagSet.Parse(selfArgs[1:]); err != nil {
|
||||||
log.Printf("invalid argument: %+v", err)
|
log.Printf("invalid argument: %+v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
flagSet = pflag.NewFlagSet(os.Args[0], pflag.ExitOnError)
|
flagSet = pflag.NewFlagSet(os.Args[0], pflag.ExitOnError)
|
||||||
flagSet.Bool(NoWaitFlag, false, "do not wait for the child process")
|
flagSet.Count(NoWaitFlag, "do not wait for the child process")
|
||||||
if err = flagSet.Parse(selfArgs[1:]); err != nil {
|
if err = flagSet.Parse(os.Args[1:]); err != nil {
|
||||||
log.Printf("invalid argument: %+v", err)
|
log.Printf("invalid argument: %+v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
viper.BindPFlag(NoWaitFlag, flagSet.Lookup(NoWaitFlag))
|
_ = viper.BindPFlag(NoWaitFlag, flagSet.Lookup(NoWaitFlag))
|
||||||
noWait = viper.GetBool(NoWaitFlag)
|
if viper.GetInt(NoWaitFlag) > 0 {
|
||||||
|
noWait = true
|
||||||
|
}
|
||||||
|
|
||||||
viper.SetEnvPrefix(wingmate.EnvPrefix)
|
viper.SetEnvPrefix(wingmate.EnvPrefix)
|
||||||
viper.BindEnv(EnvDummyPath)
|
_ = viper.BindEnv(EnvDummyPath)
|
||||||
viper.SetDefault(EnvDummyPath, DummyPath)
|
viper.SetDefault(EnvDummyPath, DummyPath)
|
||||||
|
|
||||||
exePath = viper.GetString(EnvDummyPath)
|
exePath = viper.GetString(EnvDummyPath)
|
||||||
|
|||||||
@ -58,21 +58,23 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
viper.SetEnvPrefix(wingmate.EnvPrefix)
|
viper.SetEnvPrefix(wingmate.EnvPrefix)
|
||||||
viper.BindEnv(EnvStartSecs)
|
_ = viper.BindEnv(EnvStartSecs)
|
||||||
viper.SetDefault(EnvStartSecs, EnvDefaultStartSecs)
|
viper.SetDefault(EnvStartSecs, EnvDefaultStartSecs)
|
||||||
|
|
||||||
rootCmd.PersistentFlags().StringP(pidFileFlag, "p", "", "location of pid file")
|
rootCmd.PersistentFlags().StringP(pidFileFlag, "p", "", "location of pid file")
|
||||||
rootCmd.MarkFlagRequired(pidFileFlag)
|
_ = rootCmd.MarkFlagRequired(pidFileFlag)
|
||||||
viper.BindPFlag(pidFileFlag, rootCmd.PersistentFlags().Lookup(pidFileFlag))
|
_ = viper.BindPFlag(pidFileFlag, rootCmd.PersistentFlags().Lookup(pidFileFlag))
|
||||||
|
|
||||||
app.version.Flag(rootCmd)
|
app.version.Flag(rootCmd)
|
||||||
app.version.Cmd(rootCmd)
|
app.version.Cmd(rootCmd)
|
||||||
|
|
||||||
selfArgs, childArgs, err = cli.SplitArgs(os.Args)
|
if selfArgs, childArgs, err = cli.SplitArgs(os.Args); err != nil {
|
||||||
|
selfArgs = os.Args
|
||||||
|
}
|
||||||
app.childArgs = childArgs
|
app.childArgs = childArgs
|
||||||
app.err = err
|
app.err = err
|
||||||
|
|
||||||
rootCmd.SetArgs(selfArgs)
|
rootCmd.SetArgs(selfArgs[1:])
|
||||||
if err := rootCmd.Execute(); err != nil {
|
if err := rootCmd.Execute(); err != nil {
|
||||||
log.Println(err)
|
log.Println(err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
@ -111,7 +113,10 @@ check:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err = unix.Kill(pid, syscall.Signal(0)); err != nil {
|
if err = unix.Kill(pid, syscall.Signal(0)); err != nil {
|
||||||
return err
|
if !errors.Is(err, unix.ESRCH) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
break check
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
@ -10,14 +12,26 @@ func getVersion(binPath string) (string, error) {
|
|||||||
outBytes []byte
|
outBytes []byte
|
||||||
err error
|
err error
|
||||||
output string
|
output string
|
||||||
|
stdout io.ReadCloser
|
||||||
|
n int
|
||||||
)
|
)
|
||||||
cmd := exec.Command(binPath, "version")
|
cmd := exec.Command(binPath, "version")
|
||||||
outBytes, err = cmd.Output()
|
if stdout, err = cmd.StdoutPipe(); err != nil {
|
||||||
if err != nil {
|
return "", fmt.Errorf("setting up stdout reader: %w", err)
|
||||||
return "", err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
output = string(outBytes)
|
if err = cmd.Start(); err != nil {
|
||||||
|
return "", fmt.Errorf("starting process: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
outBytes = make([]byte, 1024)
|
||||||
|
if n, err = stdout.Read(outBytes); err != nil {
|
||||||
|
return "", fmt.Errorf("reading stdout: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = cmd.Wait()
|
||||||
|
|
||||||
|
output = string(outBytes[:n])
|
||||||
output = strings.TrimRight(output, versionTrimRightCutSet)
|
output = strings.TrimRight(output, versionTrimRightCutSet)
|
||||||
return output, nil
|
return output, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,3 +6,22 @@ service:
|
|||||||
spawner:
|
spawner:
|
||||||
command: [ "wmspawner" ]
|
command: [ "wmspawner" ]
|
||||||
user: "1200"
|
user: "1200"
|
||||||
|
|
||||||
|
bgtest:
|
||||||
|
command:
|
||||||
|
- "wmstarter"
|
||||||
|
- "--no-wait"
|
||||||
|
- "--"
|
||||||
|
- "wmexec"
|
||||||
|
- "--setsid"
|
||||||
|
- "--"
|
||||||
|
- "wmbg"
|
||||||
|
- "--name"
|
||||||
|
- "test-run"
|
||||||
|
- "--pause"
|
||||||
|
- "10"
|
||||||
|
- "--log-path"
|
||||||
|
- "/var/log/wmbg.log"
|
||||||
|
- "--pid-file"
|
||||||
|
- "/var/run/wmbg.pid"
|
||||||
|
pidfile: "/var/run/wmbg.pid"
|
||||||
|
|||||||
@ -63,9 +63,7 @@ cron:
|
|||||||
|
|
||||||
iwg.Wait()
|
iwg.Wait()
|
||||||
|
|
||||||
if err = cmd.Wait(); err != nil {
|
_ = cmd.Wait()
|
||||||
wingmate.Log().Error().Str(cronTag, cron.Name()).Msgf("got error when waiting: %+v", err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
|||||||
@ -69,9 +69,8 @@ service:
|
|||||||
|
|
||||||
iwg.Wait()
|
iwg.Wait()
|
||||||
|
|
||||||
if err = cmd.Wait(); err != nil {
|
_ = cmd.Wait()
|
||||||
wingmate.Log().Error().Str(serviceTag, task.Name()).Msgf("got error when waiting: %+v", err)
|
|
||||||
}
|
|
||||||
fail:
|
fail:
|
||||||
if failStatus {
|
if failStatus {
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user