如何在golang中找到sshd服务状态

时间:2018-01-15 12:42:32

标签: go

我有以下代码

package main

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

func main() {
    cmd := exec.Command("systemctl", "check", "sshd")
    out, err := cmd.CombinedOutput()
    if err != nil {
        fmt.Println("Cannot find process")
        os.Exit(1)
    }
    fmt.Printf("Status is: %s", string(out))
    fmt.Println("Starting Role")

如果服务中断,程序将退出,通过我想获得其状态('down','inactive'等)

如果服务已启动,程序将不会退出并将打印“有效”输出

请提供任何提示?

1 个答案:

答案 0 :(得分:1)

如果exec.Command返回错误,您将退出,但是您没有检查返回的错误类型。 根据{{​​3}}:

  

如果命令启动但未成功完成,则错误为   类型* ExitError。其他错误类型可能会返回   的情况。

您应该检查错误是否与来自systemctl的非零退出代码或运行它的问题相对应,而不是仅退出。这可以通过以下方式完成:

func main() {
  cmd := exec.Command("systemctl", "check", "sshd")
  out, err := cmd.CombinedOutput()
  if err != nil {
    if exitErr, ok := err.(*exec.ExitError); ok {
      fmt.Printf("systemctl finished with non-zero: %v\n", exitErr)
    } else {
      fmt.Printf("failed to run systemctl: %v", err)
      os.Exit(1)
    }
  }
  fmt.Printf("Status is: %s\n", string(out))
}