Я пытаюсь написать оболочку приложения командной строки в GoLang, которая предоставляет REST API для взаимодействия с указанным приложением и показывает его вывод.
Обычно при запуске сервера REST API он должен запускать приложение командной строки, которое продолжает работать (например, просто Powershell.exe ) и должно иметь возможность взаимодействовать с приложением и отображать его вывод по запросу через API.
Пока сервер запускается, дочерний процесс также запускается, и я могу давать команды процессу и получать его выходные данные. Для захвата выходных данных процесса я использую байт. Буфер , который я присоединяю к процессам 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 () , этот контент будет удален, но не содержимое приложения командной строки.
Есть ли способ правильно очистить байты. Буфер, когда он подключен к Stdout / Stderr? Или, в качестве альтернативы, есть ли какой-нибудь способ ограничить буфер указанным c числом строк?