【发布时间】:2019-01-24 00:16:12
【问题描述】:
我正在远程机器上通过 SSH 执行一系列操作,我正在流式传输其 stdout 和 stderr,然后由写入器使用它,写入本地 stdout 和 stderr 以及字节缓冲区。
就在编写器使用它之前,我想对其执行一系列字符串操作,然后写入我的屏幕和缓冲区。到目前为止,一切都很好而且花花公子。
我的问题是现在它不再是流了,它挂起,然后将整个 glob 输出为一个块。我希望它是实时的,所以我将频道放在我的 goroutine 中,但没有任何改进。以下是我的功能,如果您能找出原因,或者可能是实现此目的的更好方法,请告诉我。
//发送
func handleStdStream(filters []string, replaceFilters map[string]string, pipe io.Reader, readers chan io.Reader) {
if filters != nil {
// filters exist
// read first 8 bytes
res := readPipe(8, pipe)
// get each line from the resulting streamed output
for _, str := range strings.Split(res, "\n") {
if str != "" {
out := lineFilterAndReplace(str, filters, replaceFilters)
// instantiate an io.Reader obj from the given string
outReader := strings.NewReader(out)
readers <- outReader
}
}
} else {
// filters dont exist
if len(replaceFilters) > 0 {
res := readPipe(8, pipe)
for _, str := range strings.Split(res, "\n") {
if str != "" {
out := lineReplace(str, replaceFilters)
// instantiate an io.Reader obj from the given string
outReader := strings.NewReader(out)
readers <- outReader
}
}
} else {
readers <- pipe
}
}
}
// 接收
outReaders := make(chan io.Reader)
go handleStdStream(outFilters, replaceFilters, stdoutIn, outReaders)
go func() {
for {
pipe := <-outReaders
_, errStdout = io.Copy(outWriter, pipe)
}
// _, errStdout = io.Copy(outWriter, stdoutIn)
}()
【问题讨论】:
标签: go streaming stdout stderr channels