背景
为了输出执行命令的日志,主要是执行时间很长,而且分批输出日志的命令。
代码
Go
func Execute(){
command := exec.Command("执行命令")
// 隐藏黑色窗口
command.SysProcAttr = &syscall.SysProcAttr{CreationFlags: 0x08000000}
// 输出日志
OutputLog(command)
}
func outputLog(cmd *exec.Cmd) string {
cmd.Stdin = os.Stdin
var wg sync.WaitGroup
wg.Add(2)
//捕获标准输出
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Error("INFO:", err)
os.Exit(1)
}
readOut := bufio.NewReader(stdout)
go func() {
defer wg.Done()
getOutput(readOut)
}()
//捕获标准错误
stderr, err := cmd.StderrPipe()
if err != nil {
log.Error("ERROR:", err)
os.Exit(1)
}
readErr := bufio.NewReader(stderr)
go func() {
defer wg.Done()
getOutput(readErr)
}()
//执行命令
err = cmd.Run()
if err != nil {
return ""
}
wg.Wait()
}
func getOutput(reader *bufio.Reader) string {
outputBytes := make([]byte, 200)
for {
n, err := reader.Read(outputBytes)
if err != nil {
if err == io.EOF {
break
}
//输出屏幕内容
log.Error(err)
}
output := string(outputBytes[:n])
//输出屏幕内容
log.Info(output)
}
}