- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试从一个长时间运行的(阻塞/类 shell)命令中读取标准输出,最终目标是创建一个 Go 可以与之交互的边车进程。
我有以下 MCVE:
func main() {
var err error
// Build the long-running command
args := []string{"-i0", "-o0", "-e0", "/usr/local/bin/ipython"}
cmd := exec.Command("stdbuf", args...)
// Keep the stdin file descriptor open
// Spawned command should block waiting for input
_, err = cmd.StdinPipe()
if err != nil {
panic(err)
}
// Setup pipe of `Reader` type
var stdoutBuf []byte
stdout, err := cmd.StdoutPipe()
if err != nil {
panic(err)
}
// Start the command
if err = cmd.Start(); err != nil {
panic(err)
}
go func() {
for {
// Asynchronously continue reading from stdout
n, err := stdout.Read(stdoutBuf)
fmt.Println(n)
if err != nil {
panic(err)
}
fmt.Println(stdoutBuf)
time.Sleep(time.Millisecond * 2000)
}
}()
// Block forever
if err = cmd.Wait(); err != nil {
panic(err)
}
}
从语义上讲,这种方法似乎可行。我希望 stdout.Read
会返回一些东西(ipython
shell 序言),但 n
始终为 0。
Reader.Read
从未读取任何内容?StdoutPipe
?我不认为进程本身有任何问题(这会导致读取无效的文件描述符)因为Start
不会panic
而且它看起来像cmd.Wait
永远阻塞。
最佳答案
Why does
Reader.Read
in this example never read anything?
因为您正在读取大小为 0 的缓冲区,这是 var stdoutBuf []byte
创建的。相反,使用类似的东西:
stdoutBuf := make([]byte, 4096)
您可能还想使用 bufio
.
Somewhat related question: is there a way I can block on reading
StdoutPipe
if there is nothing to be read?
stdout.Read
已经阻塞,这是 io.Reader
的典型(尽管不是必需的) :
If some data is available but not len(p) bytes, Read conventionally returns what is available instead of waiting for more. [...] Implementations of Read are discouraged from returning a zero byte count with a nil error, except when len(p) == 0.
关于go - Reader 从不读取 `StdoutPipe`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55987455/
我正在构建一个供个人使用的小型音频应用程序,需要通过管道连接到一些外部工具。 我想围绕 io.ReadCloser 构建我的程序,将其转换并通过管道传输到 PulseAudios paplay 命令。
我正在尝试从一个长时间运行的(阻塞/类 shell)命令中读取标准输出,最终目标是创建一个 Go 可以与之交互的边车进程。 我有以下 MCVE: func main() { var err e
请考虑这个 Go 代码: package main import ( "fmt" "os/exec" "strings" "time" ) const ( de
我希望能够无缝打印通过 io.ReadCloser 传递的未知(用户定义)命令的输出。 bufio.NewScanner 读取标准并正确打印文本,但是子进程打印的颜色未被记录并通过管道传递(或者我不知
我正在使用 Go 为 minecraft 服务器控制台制作包装器。它使用 os/exec 来运行服务器和 process.StdoutPipe() 从子进程实时输出。 但是,出于某种原因,我无法让它显
我正在尝试将 shell 命令的 Stdout 流式传输到控制台,但遇到了困难。 这是我目前拥有的: cmd := exec.Command("sh", "-c", `for number in {0
我正在尝试从命令的标准输出中读取,但每(大约)50 次它就会卡住一次。 func runProcess(process *exec.Cmd) (string, string, error) {
我正在尝试使用 Go 运行包含管道的命令,然后将命令的输出保存到一个变量中以备后用。下面的代码将检索要上传到 Amazon S3 的最新文件的文件名,并将其输出到终端。这样做的目的是为了以后可以使用文
我想在 Go 中执行一个命令,并将其标准输出和标准错误合并到一个流中。我写了这段代码,它只能从 stdout 读取,但我不知道如何将它与 stderr 结合起来: package main impor
我试图了解如何对必须写入有效管道的进程使用压缩(gzip),所有这些都在 go 中。 如果未检测到管道,封闭进程将出错,表明管道已损坏。据我所知,我必须使用StdoutPipe? 对于这个示例,我只是
我正在编写一个实用程序,使用 crypto/ssh 包在远程服务器上执行命令。我目前正在从 session.stdoutpipe() io.Reader 读取到 bytes.Buffer,我可以在 s
我是一名优秀的程序员,十分优秀!