Ich schreibe ein Programm in Go, das ein serverähnliches Programm ausführt (auch Go). Jetzt möchte ich die Standardausgabe des untergeordneten Programms in meinem Terminalfenster haben, in dem ich das übergeordnete Programm gestartet habe. Eine Möglichkeit, dies zu tun, ist die cmd.Output()
Funktion, die jedoch erst nach dem Beenden des Prozesses den Standard ausgibt. (Das ist ein Problem, da dieses serverähnliche Programm lange läuft und ich die Protokollausgabe lesen möchte.)
Die Variable out
ist von type io.ReadCloser
und ich weiß nicht, was ich damit machen soll, um meine Aufgabe zu erfüllen, und ich kann im Web zu diesem Thema nichts Hilfreiches finden.
func main() {
cmd := exec.Command("/path/to/my/child/program")
out, err := cmd.StdoutPipe()
if err != nil {
fmt.Println(err)
}
err = cmd.Start()
if err != nil {
fmt.Println(err)
}
//fmt.Println(out)
cmd.Wait()
}
Erklärung zum Code: Kommentieren Sie die Println
Funktion aus, um den Code zum Kompilieren zu bringen. Ich weiß, dass dies Println(out io.ReadCloser)
keine sinnvolle Funktion ist.
(Es erzeugt die Ausgabe. &{3 |0 <nil> 0}
) Diese beiden Zeilen sind nur erforderlich, damit der Code kompiliert werden kann.
quelle
io.Copy
innerhalb von Go-Routinencmd.Wait()
oder diefor{}
Schleife ... warum sind diese hier?Antworten:
Sie müssen sich nicht mit Rohren oder Goroutinen herumschlagen, dies ist einfach.
quelle
cmd.Stdin = os.Stdin
, als hätten Sie diesen Befehl buchstäblich über Ihre Shell ausgeführt.log
statt stdout, gibt es eine Antwort hierIch glaube , dass , wenn Sie importieren
io
undos
und diese ersetzen:mit diesem:
(siehe Dokumentation für
io.Copy
und füros.Stdout
), es wird tun, was Sie wollen. (Haftungsausschluss: nicht getestet.)Übrigens möchten Sie wahrscheinlich auch Standardfehler erfassen, indem Sie denselben Ansatz wie für die Standardausgabe verwenden, jedoch mit
cmd.StderrPipe
undos.Stderr
.quelle
os.Stdout
) und (2) die Prämisse zu bestätigen, dasscmd.StdoutPipe()
die Standardausgabe , wenn Sie überhaupt nicht aufrufen ,/dev/null
eher zur Standardausgabe des übergeordneten Prozesses geht .Für diejenigen, die dies nicht in einer Schleife benötigen, aber möchten, dass die Befehlsausgabe in das Terminal zurückgesendet wird, ohne dass
cmd.Wait()
andere Anweisungen blockiert werden:quelle