golang获取nginx版本

我用go的 exec.command执行/usr/local/nginx/sbin/nginx -v 命令获取版本信息,取不到任何返回结果,执行redis -v mysql -v等,都能获取正确的结果,且我在终端手动执行nginx -v是没有任何问题的,请教各位这是什么原因? 或者还有其他办法能取到吗?

cmd := exec.Command("/usr/local/nginx/sbin/nginx", "-v")
cmd.SysProcAttr = &syscall.SysProcAttr{
    Setpgid:true,
}
stdout, err := cmd.StdoutPipe()
if err != nil {
    //log.Fatal(err)
    fmt.Println(err)
}
// 保证关闭输出流
defer stdout.Close()
// 运行命令
if err := cmd.Start(); err != nil {
    fmt.Println(err)
}
// 读取输出结果
opBytes, err := ioutil.ReadAll(stdout)
if err != nil {
    fmt.Println(err)
}
if err := cmd.Wait(); err != nil {
    fmt.Println(err)
}
return string(opBytes)
阅读 2.9k
1 个回答

nginx -v是向stderr写入了数据,所以你从stdout是拿不到数据的。可以在shell环境中验证下,nginx -v 2> ./version.txt

知道了上面这点,通过exec.Command拿到这个信息也就容易了。

cmd := exec.Command("nginx", "-v")
cmd.SysProcAttr = &syscall.SysProcAttr{
    Setpgid: true,
}

out, err := cmd.CombinedOutput()
if err != nil {
    fmt.Fprintln(os.Stderr, err)
}
fmt.Println(string(out))

nginx -v为什么不向stdout写入数据呢?确实比较奇怪

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题