我正在尝试在 GoLang 中编写一个命令行应用程序包装器,它公开一个 REST API 以与所述应用程序交互并显示其输出。
基本上,当 REST API 服务器启动时,它应该启动一个持续运行的命令行应用程序(例如Powershell.exe),并且应该能够与应用程序交互并在通过 API 请求时显示其输出。
到目前为止,服务器启动了,子进程也启动了,我可以向进程发出命令并检索它的输出。为了捕获进程的输出,我使用了一个bytes.Buffer,它附加到进程Stdout和Stderr。
问题是该输出缓冲区似乎正在增长为无限,并且无法清除它。在该缓冲区上运行“ .Reset() ”似乎完全被忽略了,并且始终显示完整的缓冲输出。
这是代码:
package main
import (
"bytes"
"fmt"
"log"
"net/http"
"os/exec"
)
func main() {
var c = exec.Command("powershell.exe")
var b bytes.Buffer
c.Stdout = &b
c.Stderr = &b
stdin, err := c.StdinPipe()
if err != nil {
log.Fatal(err)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Do stuff")
})
http.HandleFunc("/clear", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Cleared")
b.Reset()
})
http.HandleFunc("/write", func(w http.ResponseWriter, r *http.Request) {
stdin.Write([]byte("echo hi\n"))
fmt.Fprintf(w, "OK")
})
http.HandleFunc("/show", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, string(b.Bytes()))
})
fmt.Println("SERVER 1 STARTING")
c.Start()
c.CombinedOutput()
http.ListenAndServe(":8081", nil)
fmt.Println("SERVER 1 STOPPED")
}
所以这里的预期行为是,当您调用“ /write ”时,它将在子应用程序中执行“echo hi”。“ /show ”将显示应用程序的输出缓冲区。“ /clear ”应该清除输出缓冲区,这样当你运行“ /write ”、“ /clear ”和“ /show ”时,应该显示一个空字符串。但在这种情况下,它会一直显示永远不会被清除的应用程序输出。
有趣的是,如果我通过b.WriteString()手动写入缓冲区,然后执行b.Reset(),该内容会被删除,但不会删除命令行应用程序中的内容。
当 bytes.Buffer 附加到 Stdout/Stderr 时,有什么方法可以正确清除它?或者,是否有某种方法可以将缓冲区限制为特定数量的行?
万千封印
相关分类