我试图从命令的Stdout中读取,但每(大约)一次它冻结一次(大约)。
func runProcess(process *exec.Cmd) (string, string, error) {
var stdout strings.Builder
var stderr string
process := exec.Command(programPath, params...)
go func() {
pipe, err := process.StderrPipe()
if err != nil {
return
}
buf, err := io.ReadAll(pipe)
if err != nil {
log.Warn("Error reading stderr: %v", err)
}
stderr = string(buf)
}()
pipe, err := process.StdoutPipe()
if err = process.Start(); err != nil {
return "", "", err
}
buf := make([]byte, 1024)
read, err := pipe.Read(buf) // it reads correctly from the pipe
for err == nil && read > 0 {
_, err = stdout.Write(buf[:read])
read, err = pipe.Read(buf) // this is where is stalls
}
if err = process.Wait(); err != nil {
return stdout.String(), stderr, err
}
return stdout.String(), stderr, nil
}
我试图一次阅读所有内容,而不是阅读块,但我得到了同样的行为。调用的程序似乎已成功执行。它的日志文件已创建并已完成。另外,当我第一次从管道中读取时(在循环之前),所有的输出都在那里。但是在循环内部,当第二次调用 时,它应该返回一个 EOF(输出小于 1024 字节),它会冻结。stdout, err := io.ReadAll(pipe).Read()
幕布斯6054654
qq_笑_17
相关分类