实时从命令 exec 捕获标准输出

Blo*_*oze 5 go

我目前正在开发一个可以执行命令的聊天机器人。我希望它做的一件事是能够运行脚本并将脚本的标准输出输出到聊天中。

我遇到的问题是该函数收集脚本的所有标准输出并在最后返回它们,我想尝试修改它以实时写入并且在这样做时遇到了问题。

我认为这个问题可能涉及到它只有一种方法可以将文本返回到聊天频道,那就是通过重启的返回功能。但是,如果可能的话,我想遍历 exec 命令并输出。

这是我的代码:

func reboot(command *bot.Cmd) (string, error) {
    n := command.Args[0]
    // this return is what all gets sent into chat channel
    return runcommand(n), nil
  }


func runcommand(server string) string {
    cmd := exec.Command("/bin/bash", "-c", "python test.py %s", server)
    cmdOutput := &bytes.Buffer{}
    cmd.Stdout = cmdOutput
    err := cmd.Run()
    if err !=nil {
        os.Stderr.WriteString(err.Error())
    }
        return fmt.Sprintf(string(cmdOutput.Bytes()))
}
Run Code Online (Sandbox Code Playgroud)

gus*_*ong 10

redis.log 的实时命令管道。(你可以打电话bgsave测试一下。)

package main

import (
    "os"
    "os/exec"
    "fmt"
    "bufio"
)

func main() {
    cmd := exec.Command("tail", "-f",  "/usr/local/var/log/redis.log")

    // create a pipe for the output of the script
    cmdReader, err := cmd.StdoutPipe()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err)
        return
    }

    scanner := bufio.NewScanner(cmdReader)
    go func() {
        for scanner.Scan() {
            fmt.Printf("\t > %s\n", scanner.Text())
        }
    }()

    err = cmd.Start()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error starting Cmd", err)
        return
    }

    err = cmd.Wait()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err)
        return
    }
}
Run Code Online (Sandbox Code Playgroud)