[main] Add -- cmd flag separator to start different Gost processes

This commit is contained in:
Carlos Ibáñez 2022-12-13 20:35:30 +01:00 committed by ginuerzh
parent fec33e62ea
commit 5d9d33f368

View File

@ -7,6 +7,10 @@ import (
_ "net/http/pprof" _ "net/http/pprof"
"os" "os"
"os/signal" "os/signal"
"os/exec"
"strings"
"sync"
"context"
"runtime" "runtime"
"syscall" "syscall"
@ -30,6 +34,45 @@ var (
metricsAddr string metricsAddr string
) )
func init() {
args := strings.Join(os.Args[1:], " ")
if strings.Contains(args, " -- ") {
var (
wg sync.WaitGroup
ret int
)
ctx, cancel := context.WithCancel(context.Background())
for wid, wargs := range strings.Split(" " + args + " ", " -- ") {
wg.Add(1)
go func(wid int, wargs string) {
defer wg.Done()
defer cancel()
worker(wid, strings.Split(wargs, " "), &ctx, &ret)
}(wid, strings.TrimSpace(wargs))
}
wg.Wait()
os.Exit(ret)
}
}
func worker(id int, args []string, ctx *context.Context, ret *int) {
cmd := exec.CommandContext(*ctx, os.Args[0], args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Env = append(os.Environ(), fmt.Sprintf("_GOST_ID=%d", id))
cmd.Run()
if cmd.ProcessState.Exited() {
*ret = cmd.ProcessState.ExitCode()
}
}
func init() { func init() {
var printVersion bool var printVersion bool