我正在尝试制作一个可以运行可执行文件的程序,如果该可执行文件在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(),它可以工作,但这违背了整个目的)。我试过寻找其他方法来做这件事,但我找不到其他的方法。
还有其他方法可以做到吗?如果是的话,我该如何使用呢?
发布于 2022-01-05 19:09:16
这对我起了作用:
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")
}
}发布于 2022-01-05 15:57:19
总是检查错误。
如果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将为零--因此您将陷入运行时恐慌。
https://stackoverflow.com/questions/70595788
复制相似问题