package main import ( "bytes" "log" "os/exec" "syscall" ) func runCommand(name string, args ...string) (stdout string, stderr string, exitCode int) { var outbuf, errbuf bytes.Buffer cmd := exec.Command(name, args...) cmd.Stdout = &outbuf cmd.Stderr = &errbuf err := cmd.Run() stdout = outbuf.String() stderr = errbuf.String() if err != nil { // try to get the exit code if exitError, ok := err.(*exec.ExitError); ok { ws := exitError.Sys().(syscall.WaitStatus) exitCode = ws.ExitStatus() } else { log.Printf("Could not get exit code for failed program: %v, %v", name, args) exitCode = exitCodeCatchAll if stderr == "" { stderr = err.Error() } } } else { // success, exitCode should be 0 if go is ok ws := cmd.ProcessState.Sys().(syscall.WaitStatus) exitCode = ws.ExitStatus() } return }