golang 执行系统命令 ps aux | grep "xxxx",总是异常退出

正确姿势:博客:Golang 使用执行命令带管道符执行的方法

导致这个问题的原因是管道符 | 不能写在 exec.Command() 中,要分开执行两条命令。方法如下

func Demo() (err error) {
    psCmd := exec.Command("ps", "aux")
    psStdout, psStderr := SetCommandStd(psCmd)
    err = psCmd.Run()
    if err != nil {
      err = errors.New(err.Error() + psStderr.String())
      return
    }
    // 筛选
    grepCmd := exec.Command("grep", "mysql")
    grepCmd.Stdin = psStdout
    grepStdout, grepStderr := SetCommandStd(grepCmd)
    err = grepCmd.Run()
    if err != nil {
      err = errors.New(err.Error() + grepStderr.String())
      return
    }
}
func SetCommandStd(cmd *exec.Cmd) (stdout, stderr *bytes.Buffer) {
    stdout = &bytes.Buffer{}
    stderr = &bytes.Buffer{}
    cmd.Stdout = stdout
    cmd.Stderr = stderr
    return
}

楼下回答有正解

本作品采用《CC 协议》,转载必须注明作者和本文链接
做自己
讨论数量: 3

不是吧 如果多几个过滤,岂不好多重复代码

4年前 评论
DukeAnn

@lovecn 如果你有更好的 记得回我哦

4年前 评论
awesee

async

func async() {
    cmd1 := exec.Command("ls", ".")
    cmd2 := exec.Command("grep", "go")
    cmd2.Stdout = os.Stdout
    { // 这部分代码可以封装
        out, _ := cmd1.StdoutPipe()
        in, _ := cmd2.StdinPipe()
        go func() {
            defer func() {
                out.Close()
                in.Close()
            }()
            io.Copy(in, out)
        }()
    }
    cmd1.Run()
    cmd2.Run()
}

sync

func sync() {
    cmd1 := exec.Command("ps", "aux")
    cmd2 := exec.Command("grep", "mysql")
    in, _ := cmd2.StdinPipe()
    cmd1.Stdout = in
    cmd2.Stdout = os.Stdout
    cmd2.Start()
    cmd1.Run()
    in.Close()
    cmd2.Wait()
}

For more

func main() {
    cmd1 := exec.Command("ls", ".")
    cmd2 := exec.Command("grep", "go")
    cmd3 := exec.Command("grep", "main")
    cmd3.Stdout = os.Stdout
    pipe(cmd1, cmd2, cmd3)
    cmd1.Run()
    cmd2.Run()
    cmd3.Run()
}

func pipe(cmds ...*exec.Cmd) {
    for i, cmd := range cmds {
        if i > 0 {
            out, _ := cmds[i-1].StdoutPipe()
            in, _ := cmd.StdinPipe()
            go func() {
                defer func() {
                    out.Close()
                    in.Close()
                }()
                io.Copy(in, out)
            }()
        }
    }
}
4年前 评论
DukeAnn (楼主) 4年前
awesee (作者) 4年前
DukeAnn (楼主) 4年前
awesee (作者) 4年前
DukeAnn (楼主) 4年前
awesee (作者) 4年前
DukeAnn (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!