为了账号安全,请及时绑定邮箱和手机立即绑定

检查 exec.Command 是否退出

检查 exec.Command 是否退出

Go
哈士奇WWW 2022-10-24 15:11:08
我正在尝试制作一个可以运行可执行文件的程序,并获取可执行文件是否在 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()它可以工作,但这会破坏整个目的)。我已经尝试寻找其他方法来做到这一点,但我找不到任何其他方法。还有其他方法可以做到这一点吗?如果是这样,我该如何使用它?
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

始终检查错误。


从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则将为零-因此您将遇到运行时恐慌。


查看完整回答
反对 回复 2022-10-24
?
偶然的你

TA贡献1841条经验 获得超3个赞

这对我有用:


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-10-24
  • 2 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信