- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请考虑这个 Go 代码:
package main
import (
"fmt"
"os/exec"
"strings"
"time"
)
const (
debugCmd = "/usr/bin/libinput debug-events"
//debugCmd = "tail -f /tmp/syslog"
)
func main() {
fmt.Println("Hello!")
fmt.Println("cmd", debugCmd)
cmdSplat := strings.Split(debugCmd, " ")
cmd := exec.Command(cmdSplat[0], cmdSplat[1:]...)
stdOut, err := cmd.StdoutPipe()
if err != nil {
fmt.Println("cmd.StdOut failed", err)
}
defer stdOut.Close()
go func() {
tempBuf := make([]byte, 1024)
for {
n, err := stdOut.Read(tempBuf)
if n > 0 {
fmt.Printf("Read: %d bytes, err: %v\n", n, err)
someSlice := tempBuf[:n]
fmt.Println("text", string(someSlice))
} else {
fmt.Printf("Zero Read :%d, err: %v", n, err)
}
}
}()
fmt.Println("STarting cmd")
err = cmd.Start()
if err != nil {
fmt.Println("cmd.start", err)
}
fmt.Println("All done!")
// cmd.Wait()
time.Sleep(60 * time.Second)
fmt.Println("Done sleeping!")
}
在现实生活中,它只有在读取 1024 个字节后才开始接收。早些时候我使用 bufio 进行了此操作,但这也很慢:
go func() {
r := bufio.NewReader(stdOut)
for {
line, err := r.ReadString('\n')
if err != nil {
fmt.Println("End of things!")
break
}
fmt.Print(line)
}
}()
我的目标是取货
debug-events
来自
stdOut io.ReadCloser
相当快 - 当它们发生和出现时 - 而不是带有 1024 字节水印的批次。
Read: 1024 bytes, err: <nil> // <------------ this
text finger)
event5 POINTER_AXIS +2.380s vert -11.14/0* horiz 10.75/0* (finger)
event5 POINTER_AXIS +2.400s vert -8.97/0* horiz 6.54/0* (finger)
<snip>
event5 POINTER_AXIS +3.219s vert 7.42/0* horiz 0.00/0 (finger)
event5 POINTER_AXIS
Read: 1024 bytes, err: <nil> // <-------------- this
text +3.238s vert 9.28/0* horiz -15.89/0* (finger)
event5 POINTER_AXIS +3.257s vert 8.66/0* horiz -17.29/0* (finger)
event5 POINTER_AXIS +3.277s vert 7.42/0* horiz -11.69/0* (finger)
<snip>
event5 POINTER_AXIS +3.491s vert 0.00/0* horiz 0.00/0* (finger)
event5 POINTER_MOTION +3
Read: 1024 bytes, err: <nil>
text .980s -0.23/ -0.90 ( -1.00/ -3.97)
你能指出我正确的方法吗?
最佳答案
正如评论中所讨论的,这根本不是 Go 问题,而只是需要使用 the stdbuf
command在 GNU/Linux 系统上。另见 this unix.stackexchange.com question and answer .一般的想法是确保您使用 exec.Command
运行的程序不会不恰本地缓冲自己的输出。
(stdbuf 程序通常使用 LD_PRELOAD
为 stdin、stdout 和 stderr 插入备用 I/O 缓冲,或者可以内置到操作系统的标准库中。)
关于go - 从 cmd.StdoutPipe() 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63275117/
我正在构建一个供个人使用的小型音频应用程序,需要通过管道连接到一些外部工具。 我想围绕 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
我是一名优秀的程序员,十分优秀!