【问题标题】:Querying ProcessState查询进程状态
【发布时间】:2018-07-15 14:52:47
【问题描述】:

我有一个简单的程序并运行一个 exe 并在之后检查 Exited 值,但它给了我一个“恐慌:运行时错误:无效的内存地址或 nil 指针取消引用”错误,知道为什么吗?

package main

import (
    "fmt"
    "os/exec"
    "time"
)

func main() {
    prog:= exec.Command("path\to\exe")
    prog.Dir = "path\to"
    go prog.Run()
    fmt.Println(prog.ProcessState.Exited())
    time.Sleep(500 * time.Second)
}

【问题讨论】:

  • 发布的代码无法编译。也许您打算在字符串文字中使用 / 而不是 \。
  • \\ 实际上,它在 Windows 上。

标签: go process status


【解决方案1】:

documentation says:

ProcessState 包含有关在调用 Wait 或 Run 后可用的已退出进程的信息。

主 goroutine 在通过调用 goroutine 中的 Run() 将字段设置为非 nil 值之前访问 ProcessState 字段。因此,对 Exited() 的调用会发生恐慌。

一个简单的解决方法是从主 goroutine 调用 Run()。

【讨论】:

  • 谢谢,这是解释性的。如果我理解正确,只有在进程退出后才会填充 ProcessState? Exited() 不会一直评估为真吗?我有一个正在监听 8080 的 Gin 网络服务器应用程序 (github.com/wys35/GoAPIserver),因此不会返回。我打算做的是让进程作为服务运行(github.com/kardianos/service/blob/master/example/runner/…),奇怪的是第 98 行,即使我可以看到我的 exe 在任务管理器中运行,它的评估结果也是 true。你有这个想法吗?
  • 在某些操作系统上,Exited() 仅在进程正常退出时返回 true。如果进程被信号和其他条件终止,Exited() 返回 false。由于我多年未使用 Windows,因此无法解决特定于 Windows 的问题。
  • 同样感谢。
猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多