Я пытаюсь выполнить программу в golang и перехватить вывод второй программы для прохождения веб-вывода. Одиночное выполнение не вызывает никаких проблем,
//One exec
t := time.Now()
filename := "backup-" + hostname + "-" + t.Format(time.RFC3339) + ".img"
w.Header().Set("Content-Disposition", "attachment; filename="+filename)
// Set HTTP header befare Transfering data.
w.Header().Set("Transfer-Encoding", "chunked")
ddCommand := exec.Command("dd", fmt.Sprintf("if=%s", r.URL.Path[6:]))
pipeIn, pipeWriter := io.Pipe()
ddCommand.Stdout = pipeWriter
ddCommand.Stderr = pipeWriter
go writeCmdOutput(w, pipeIn)
ddCommand.Run()
pipeWriter.Close()
, но когда я добавил в программу вторую программу, программа не выдает никаких выходных данных.
// Get time and set headers
t := time.Now()
filename := "backup-" + hostname + "-" + t.Format(time.RFC3339) + ".img.gz"
w.Header().Set("Content-Disposition", "attachment; filename="+filename)
w.Header().Set("Transfer-Encoding", "chunked")
pipeIn, pipeWriter := io.Pipe()
ddCommand := exec.Command("dd", fmt.Sprintf("if=%s", r.URL.Path[9:]))
gzipCommand := exec.Command("gzip ", "-1", "-")
gzipCommand.Stdin, _ = ddCommand.StdoutPipe()
gzipCommand.Stdout = pipeWriter
go writeCmdOutput(w, pipeIn)
_ = gzipCommand.Start()
_ = ddCommand.Run()
_ = gzipCommand.Wait()
pipeWriter.Close()
Но когда я пытаюсь запустить команду без конвейера выполнение дает вывод в реальном времени. Пример команды
topCommand := exec.Command("top","-d 0.5", "-b", "-n 5")
awkCommand := exec.Command("grep", "bash")
awkCommand.Stdin, _ = topCommand.StdoutPipe()
awkCommand.Stdout = os.Stdout
_ = awkCommand.Start()
_ = topCommand.Run()
_ = awkCommand.Wait()
Итак, как я могу решить эту проблему?
Для получения более подробной информации Источник проекта