鍍金池/ 問(wèn)答/GO  Linux/ golang獲取nginx版本

golang獲取nginx版本

我用go的 exec.command執(zhí)行/usr/local/nginx/sbin/nginx -v 命令獲取版本信息,取不到任何返回結(jié)果,執(zhí)行redis -v mysql -v等,都能獲取正確的結(jié)果,且我在終端手動(dòng)執(zhí)行nginx -v是沒(méi)有任何問(wèn)題的,請(qǐng)教各位這是什么原因? 或者還有其他辦法能取到嗎?

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)
}
// 保證關(guān)閉輸出流
defer stdout.Close()
// 運(yùn)行命令
if err := cmd.Start(); err != nil {
    fmt.Println(err)
}
// 讀取輸出結(jié)果
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寫(xiě)入了數(shù)據(jù),所以你從stdout是拿不到數(shù)據(jù)的??梢栽趕hell環(huán)境中驗(yàn)證下,nginx -v 2> ./version.txt。

知道了上面這點(diǎn),通過(guò)exec.Command拿到這個(gè)信息也就容易了。

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寫(xiě)入數(shù)據(jù)呢?確實(shí)比較奇怪

2017年1月19日 03:15