Функция Multipe EXE c .Command с конвейерами не дает вывод в Golang - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь выполнить программу в 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()

Итак, как я могу решить эту проблему?
Для получения более подробной информации Источник проекта

...