猿问

检查 exec.Command 是否退出

我正在尝试制作一个可以运行可执行文件的程序,并获取可执行文件是否在 2 秒内退出


files, _ := ioutil.ReadDir("Files/")


for _, f := range files {

    cmd := exec.Command(fmt.Sprint("Files/", f.Name()))

    cmd.Start()

    time.Sleep(2 * time.Second)

    if cmd.ProcessState.Exited() {

        fmt.Println("Exited")

    } else {

        fmt.Println("Not exited")

    }

}

这给出了一个panic: runtime error: invalid memory address or nil pointer dereference

因为它还没有设置(如果我使用cmd.Run()它可以工作,但这会破坏整个目的)。我已经尝试寻找其他方法来做到这一点,但我找不到任何其他方法。

还有其他方法可以做到这一点吗?如果是这样,我该如何使用它?


哈士奇WWW
浏览 183回答 2
2回答

慕容森

始终检查错误。从cmd.Start 文档如果 Start 返回成功,将设置c.Process字段。所以确保cmd.Start没有出错:err := cmd.Start()if err != nil {    log.Fatalf("cmd.Start error: %v", err)}也来自exec.Cmd 文档:// ProcessState contains information about an exited process,// available after a call to Wait or Run.ProcessState *os.ProcessState// contains filtered or unexported fields因此,如果该过程尚未完成,ProcessState则将为零-因此您将遇到运行时恐慌。

偶然的你

这对我有用:files, _ := ioutil.ReadDir("Files/")for _, f := range files {    cmd := exec.Command(fmt.Sprint("Files/", f.Name()))    cmd.Start()    time.Sleep(2 * time.Second)    check, _ := exec.Command("tasklist", "/FI", "PID eq "+fmt.Sprint(cmd.Process.Pid)).Output()    output := string(check)    if strings.HasPrefix(output, "INFO: No tasks are running") {        fmt.Println("Exited")    } else {        fmt.Println("Still running")    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答