使用Go检查是否已安装系统软件包并退出程序

时间:2019-03-22 16:27:27

标签: go

我正在尝试检查系统中是否安装了软件包(Centos / Yum)。我正在尝试使用该exec.Command方法:

func YumCheckIfPackageInstalled(pkg string) string {
    out,err := exec.Command("yum", "list", "installed", pkg).Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Output %s\n", out)

    return "string"
}

问题是,安装了“ pkg”后,程序将继续工作,但如果没有,它将退出:

exit status 1

如何防止程序因os命令错误退出?

我要实现的是检查是否安装了某些软件包,如果没有,我要安装它们。也许有比执行exec.Command-s更好的方法来解决该问题?

1 个答案:

答案 0 :(得分:2)

由于命令错误,您的程序没有退出。

由于您输入了log.Fatal(err),因此退出。

log.Fatal以SIGINT 1退出程序,如果您只想记录错误,请执行log.Println(err)。在此处查看文档:{​​{3}}

此外,要做到这一点,您应该使错误冒泡,并让函数的调用者处理错误。

现在,关于您要执行的操作,我建议使用LookPath包中的函数exec,它通过在路径中搜索具有给定名称的可执行文件来实现您想要的功能。这是文档:https://golang.org/pkg/log/#Logger.Fatal

您可以执行以下操作:

package main

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

var pkg = flag.String("pkg", "", "package name")

func main() {
        flag.Parse()

        if !PackageInstalled(*pkg) {
                if err := InstallPackage(*pkg); err != nil {
                        log.Fatal(err)
                }
                fmt.Printf("Package %s installed\n", *pkg)
                return
        }
        fmt.Printf("Package %s already installed\n", *pkg)
}

func PackageInstalled(pkg string) bool {
        _, err := exec.LookPath(pkg)

        // check error
        if err != nil {
                // the executable is not found, return false
                if execErr, ok := err.(*exec.Error); ok && execErr.Err == exec.ErrNotFound {
                        return false
                }
                // another kind of error happened, let's log and exit
                log.Fatal(err)
        }

        return true
}

func InstallPackage(pkg string) error {
        // install your package
        // ...
        return nil
}

并以这种方式运行go run main.go -pkg yum