Last active
October 22, 2022 12:33
-
-
Save rms1000watt/0e8a90218b60cbc109aebce6815927c2 to your computer and use it in GitHub Desktop.
Execute Command with stdout Pipe in Golang
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"bufio" | |
"fmt" | |
"os/exec" | |
"errors" | |
"strings" | |
log "github.com/sirupsen/logrus" | |
) | |
func main() { | |
execute("ping -c 2 www.google.com") | |
} | |
func execute(cmd string) (err error) { | |
if cmd == "" { | |
return errors.New("No command provided") | |
} | |
cmdArr := strings.Split(cmd, " ") | |
name := cmdArr[0] | |
args := []string{} | |
if len(cmdArr) > 1 { | |
args = cmdArr[1:] | |
} | |
command := exec.Command(name, args...) | |
command.Env = os.Environ() | |
stdout, err := command.StdoutPipe() | |
if err != nil { | |
log.Error("Failed creating command stdoutpipe: ", err) | |
return err | |
} | |
defer stdout.Close() | |
stdoutReader := bufio.NewReader(stdout) | |
stderr, err := command.StderrPipe() | |
if err != nil { | |
log.Error("Failed creating command stderrpipe: ", err) | |
return err | |
} | |
defer stderr.Close() | |
stderrReader := bufio.NewReader(stderr) | |
if err := command.Start(); err != nil { | |
log.Error("Failed starting command: ", err) | |
return err | |
} | |
go handleReader(stdoutReader) | |
go handleReader(stderrReader) | |
if err := command.Wait(); err != nil { | |
if exiterr, ok := err.(*exec.ExitError); ok { | |
if status, ok := exiterr.Sys().(syscall.WaitStatus); ok { | |
log.Debug("Exit Status: ", status.ExitStatus()) | |
return err | |
} | |
} | |
return err | |
} | |
} | |
func handleReader(reader *bufio.Reader) { | |
printOutput := log.GetLevel() == log.DebugLevel | |
for { | |
str, err := reader.ReadString('\n') | |
if err != nil { | |
break | |
} | |
if printOutput { | |
fmt.Print(str) | |
} | |
} | |
} |
ldrrp
commented
Feb 22, 2022
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment