Files
kt-connect/pkg/kt/exec/run.go
2020-03-11 23:58:17 +08:00

58 lines
1.2 KiB
Go

package exec
import (
"bytes"
"io"
"os"
"os/exec"
"time"
"github.com/rs/zerolog/log"
)
// RunAndWait run cmd
func RunAndWait(cmd *exec.Cmd, name string, debug bool) (err error) {
runCmd(cmd, name, debug)
err = cmd.Wait()
return
}
// BackgroundRun run cmd in background
func BackgroundRun(cmd *exec.Cmd, name string, debug bool) (err error) {
runCmd(cmd, name, debug)
go func() {
err = cmd.Wait()
log.Info().Msgf("%s finished", name)
}()
return
}
func runCmd(cmd *exec.Cmd, name string, debug bool) (err error) {
log.Debug().Msgf("Child, os.Args = %+v", os.Args)
log.Debug().Msgf("Child, name = %s, cmd.Args = %+v", name, cmd.Args)
var stdoutBuf, stderrBuf bytes.Buffer
stdoutIn, _ := cmd.StdoutPipe()
stderrIn, _ := cmd.StderrPipe()
// var errStdout, errStderr error
stdout := io.MultiWriter(os.Stdout, &stdoutBuf)
stderr := io.MultiWriter(os.Stderr, &stderrBuf)
go func() {
_, _ = io.Copy(stdout, stdoutIn)
}()
go func() {
_, _ = io.Copy(stderr, stderrIn)
}()
err = cmd.Start()
if err != nil {
return
}
time.Sleep(time.Duration(2) * time.Second)
pid := cmd.Process.Pid
log.Info().Msgf("%s start at pid: %d", name, pid)
return
}