Estou escrevendo um programa em Go que executa um programa semelhante a um servidor (também Go). Agora, quero ter o stdout do programa filho na janela do terminal onde iniciei o programa pai. Uma maneira de fazer isso é com a cmd.Output()
função, mas ela imprime o stdout somente depois que o processo é encerrado. (Isso é um problema porque este programa semelhante a um servidor é executado por um longo tempo e eu quero ler a saída do log)
A variável out
é de type io.ReadCloser
e não sei o que devo fazer com ela para cumprir minha tarefa e não consigo encontrar nada de útil na web sobre esse assunto.
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()
}
Explicação para o código: descomente a Println
função para obter o código para compilar, eu sei que Println(out io.ReadCloser)
não é uma função significativa.
(produz a saída &{3 |0 <nil> 0}
) Essas duas linhas são necessárias apenas para obter o código para compilar.
fonte
io.Copy
dentro das rotinas gocmd.Wait()
ou fazer ofor{}
loop ... por que estão aqui?Respostas:
Não há necessidade de mexer com canos ou goroutines, este é fácil.
fonte
cmd.Stdin = os.Stdin
, tornando-o como se tivesse literalmente executado esse comando a partir do seu shell.log
vez de stdout, há uma resposta aquiEu acredito que se você importar
io
eos
e substituir este:com isso:
(consulte a documentação para
io.Copy
e paraos.Stdout
), ele fará o que você quiser. (Isenção de responsabilidade: não testado.)A propósito, provavelmente você também desejará capturar o erro padrão, usando a mesma abordagem que para a saída padrão, mas com
cmd.StderrPipe
eos.Stderr
.fonte
os.Stdout
) e (2) confirmar a premissa de que, se você não chamarcmd.StdoutPipe()
, a saída padrão vai para/dev/null
a saída padrão do processo pai .Para aqueles que não precisam disso em um loop, mas gostariam que a saída do comando ecoasse no terminal sem
cmd.Wait()
bloquear outras instruções:fonte