go - 终止过程:消音和终止信号之间的区别

标签 go

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    cmd := exec.CommandContext(ctx, "sleep", "1000")

    go func() {
        time.Sleep(2 * time.Second)
        //cmd.Process.Signal(os.Kill)
        //cmd.Process.Signal(os.Interrupt)
        cancel()

    }()

    if err := cmd.Run(); err != nil {
        fmt.Println(err.Error())
    }

    fmt.Println("Finishing...")
}

cancelSignal(os.Kill)之间有什么区别吗?它们会导致相同的错误。
如何区分终止信号和由于错误而终止?仅通过检查err.Error() == "signal: killed"吗?

最佳答案

exec.CommandContext的文档为您提供了这一答案:

如果上下文在命令本身完成之前完成,则提供的上下文用于终止进程(通过调用os.Process.Kill)。

依次,os.Process.Kill调用特定于os的kill()函数,posix的以下函数:

func (p *Process) kill() error {
    return p.Signal(Kill)
}
因此,两者最终都调用了Signal(os.Kill)
至于如何区别,您有两个基本选择:
  • 解析可能是脆弱的错误(尽管直接对signal: killed进行检查不是太糟糕
  • 检查退出代码,当被SIGKILL终止时应该为137,应该是137。

  • 关于go - 终止过程:消音和终止信号之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63582844/

    相关文章:

    JSON Unmarshal 预期响应和错误消息

    去测试不会构建 : Call has possible formatting directive

    time - 使用 golang Playground 功能在测试期间伪造时间

    go - 我有一个奇怪的错误

    go - 在我的代码中安全完成 goroutines 的正确方法是什么?

    go - 什么是 C 的三元运算符的惯用 Go 等价物?

    go - 如何从应用程序调用谷歌云身份API

    go - 为什么不能转换 Slice 类型?

    json - Golang Unmarshal slice of slice of ints

    recursion - 在golang中创建数字组合的递归函数