我用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)
nginx -v
是向stderr
写入了数据,所以你从stdout
是拿不到数据的。可以在shell环境中验证下,nginx -v 2> ./version.txt
。知道了上面这点,通过
exec.Command
拿到这个信息也就容易了。nginx -v
为什么不向stdout
写入数据呢?确实比较奇怪