Skip to content

Instantly share code, notes, and snippets.

@rms1000watt
Last active October 22, 2022 12:33
Show Gist options
  • Save rms1000watt/0e8a90218b60cbc109aebce6815927c2 to your computer and use it in GitHub Desktop.
Save rms1000watt/0e8a90218b60cbc109aebce6815927c2 to your computer and use it in GitHub Desktop.
Execute Command with stdout Pipe in Golang
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
Copy link

ldrrp commented Feb 22, 2022

Whats stopping handleReader from running indefinitely.

@ldrrp
Copy link

ldrrp commented Feb 22, 2022

func handleReader(reader *bufio.Reader) error {
	for {
		str, err := reader.ReadString('\n')
		if len(str) == 0 && err != nil {
			if err == io.EOF {
				break
			}
			return err
		}

		fmt.Print(str)

		if err != nil {
			if err == io.EOF {
				break
			}
			return err
		}
	}

	return nil
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment