首页 > 解决方案 > Go 程序在使用错误代码调用其他程序后结束

问题描述

我有以下问题:我正在从 go 例程中调用“cryptsetup”。因此,如果 cryptsetup 成功并以 exitcode 0 退出,则一切正常。如果 cryptsetup 遇到错误,例如密码错误,并以错误代码 != 0 退出,我的 go 函数只会打印错误,然后退出而不会出现恐慌或错误代码。

openCmd := exec.Command("cryptsetup", "luksOpen", *container, "container")
var inPipe io.WriteCloser
if inPipe, err = openCmd.StdinPipe(); err == nil {
    if err = openCmd.Start(); err == nil {
        log.Println("cryptsetup command started!")
        inPipe.Write([]byte(pwd))
        log.Println("luks password passed!")
        inPipe.Close()
        log.Println("stdin pipe closed!")
        if err = openCmd.Wait(); err == nil {
            log.Println("Container opened!")
            if err = exec.Command("mount", "-t", "ext4", "/dev/mapper/container", "/mnt").Run(); err == nil {
                mountStatus.isMounted = true
                pwd = ""
                log.Println("Container mounted!")
                return true
            } else {
                log.Fatalf("Couldn't mount partition: %s", err)
            }
        } else {
            log.Fatalf("cryptsetup execution failed: %s", err)
        }
    } else {
        log.Fatalf("Couldn't start cryptsetup command: %s", err)
    }
} else {
    log.Fatalf("Couldn't open cryptsetup stdin: %s", err)
}

我的控制台输出如下所示:

2018/06/21 09:05:17 cryptsetup command started!
2018/06/21 09:05:17 luks password passed!
2018/06/21 09:05:17 stdin pipe closed!
2018/06/21 09:05:20 cryptsetup execution failed: exit status 2

我不知道为什么我的程序退出。任何人都可以帮忙吗?

标签: goexec

解决方案


因为您正在调用log.Fatalf(),并从其文档中引用:

Fatalf 等价于 Printf()然后调用 os.Exit(1)

log.Fatalf()故意终止您的应用程序。如果您不希望它终止,请不要调用log.Fatalf(),而是log.Printf()改为。


推荐阅读