Проверка с помощью Go, установлен ли системный пакет при выходе из программы - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь проверить, установлен ли пакет в системе (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 Ответ

2 голосов
/ 22 марта 2019

Ваша программа не выходит из-за ошибки команды.

Это выход, потому что вы положили log.Fatal(err).

log.Fatal выходит из программы с SIGINT 1, если вы просто хотите зарегистрировать ошибку, выполните log.Println(err). Смотрите документ здесь: https://golang.org/pkg/log/#Logger.Fatal

Кроме того, чтобы сделать это, вы должны вспомнить ошибку и позволить вызывающей функции обработать ошибку.

Теперь, что касается того, что вы хотите сделать, я предлагаю использовать функцию 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...