package main import ( "os" "os/exec" "syscall" ) func Start(args ...string) (pid int) { if binary, lookErr := exec.LookPath(args[0]); lookErr == nil { args[0] = binary var procAttr syscall.ProcAttr procAttr.Files = []uintptr{uintptr(syscall.Stdin), uintptr(syscall.Stdout), uintptr(syscall.Stderr)} p, execErr := syscall.ForkExec(args[0], args[1:], &procAttr) if execErr != nil { panic(execErr) } pid = p } else { panic(lookErr) } return } func Wait(pid int) { proc, err := os.FindProcess(pid) if err == nil { for { ps, err := proc.Wait() if ps.Exited() && err == nil { return } } } panic(err) } func main() { pid := Start("bash") Wait(pid) }