代码之家  ›  专栏  ›  技术社区  ›  user3069488

在退出程序时,使用Go检查是否安装了系统包

go
  •  0
  • user3069488  · 技术社区  · 7 年前

    我正在检查系统(Centos/Yum)中是否安装了软件包。我在试着用那个执行官。命令方式:

    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更好的方法来解决这个问题。指挥系统?

    0 回复  |  直到 7 年前
        1
  •  2
  •   Francois    7 年前

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

    因为你把 log.Fatal(err) .

    log.Fatal 使用SIGINT 1退出程序,如果只想记录错误,请执行以下操作: log.Println(err) .请参见此处的文档: https://golang.org/pkg/log/#Logger.Fatal

    此外,要以goway的方式执行此操作,您应该冒泡错误,并让函数的调用方处理错误。

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

    你可以这样做:

    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