package instance import ( "fmt" "os" "os/exec" "strings" "syscall" "golang.org/x/sys/windows" ) func Detach() error { if AlreadyRunning() { return fmt.Errorf("agent already running") } exe, err := os.Executable() if err != nil { return err } nul, err := os.OpenFile("NUL", os.O_RDWR, 0) if err != nil { return err } defer nul.Close() cmd := exec.Command(exe, stripBackground(os.Args[1:])...) cmd.Stdin = nul cmd.Stdout = nul cmd.Stderr = nul cmd.SysProcAttr = &syscall.SysProcAttr{ HideWindow: true, CreationFlags: windows.CREATE_NO_WINDOW | windows.CREATE_NEW_PROCESS_GROUP, } return cmd.Start() } func stripBackground(args []string) []string { out := make([]string, 0, len(args)) for _, arg := range args { name := strings.TrimLeft(arg, "-/") lower := strings.ToLower(name) if lower == "background" || strings.HasPrefix(lower, "background=") { continue } out = append(out, arg) } return out }