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...")
}
cancel
和Signal(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/