Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Start a detached process on Windows using Golang

Tags:

windows

go

I have a Golang code which must run a detached child process.

The Linux version of my implementation using syscall.ForkExec like this.

syscall.ForkExec(my_program, []string{}, nil)

But I can't found Windows implementation. I have found a proposition using START /B.

cmd := exec.Command("START", "/B", my_program)
cmd.Start()

Unfortunately, START can't be found and I have no other solution using Golang.

like image 999
Baptiste Donaux Avatar asked May 25 '18 14:05

Baptiste Donaux


2 Answers

start is not a standalone application, it's an (internal) command of the Windows command line interpreter (cmd.exe) (details: Command line reference / Start), so you need a "shell" to run the start command.

Use cmd.exe with the /C parameter, and pass start and your application to run.

Like in this example:

s := []string{"cmd.exe", "/C", "start", `c:\path\to\your\app\myapp.exe`}

cmd := exec.Command(s[0], s[1:]...)
if err := cmd.Run(); err != nil {
    log.Println("Error:", err)
}

Or without the command slice:

cmd := exec.Command("cmd.exe", "/C", "start", `c:\path\to\your\app\myapp.exe`)
if err := cmd.Run(); err != nil {
    log.Println("Error:", err)
}

You may also pass the /b param to start like this if you don't want a terminal window for the launched application:

cmd := exec.Command("cmd.exe", "/C", "start", "/b", `c:\path\to\your\app\myapp.exe`)
if err := cmd.Run(); err != nil {
    log.Println("Error:", err)
}
like image 157
icza Avatar answered Oct 22 '22 18:10

icza


It's not clear to me what you mean by detached. If you mean in the sense, "don't wait for program to finish", you don't need a shell for that:

package main
import "os/exec"

func main() {
   exec.Command("firefox", "google.com/search?q=golang").Start()
}

https://golang.org/pkg/os/exec#Cmd.Start

like image 1
Zombo Avatar answered Oct 22 '22 18:10

Zombo