首页 >后端开发 >Golang >为什么 `cmd.Process.Kill()` 不杀死 Go 中的子进程,以及如何修复超时?

为什么 `cmd.Process.Kill()` 不杀死 Go 中的子进程,以及如何修复超时?

Patricia Arquette
Patricia Arquette原创
2024-12-09 15:08:17220浏览

Why Doesn't `cmd.Process.Kill()` Kill Child Processes in Go, and How Can I Fix Timeouts?

使用 Go 杀死子进程时的超时故障排除

在 Go 中处理子进程时,了解杀死它们所涉及的细微差别至关重要正确。在一个实例中,开发人员遇到了超时机制未按预期运行的问题。

尽管发送了 SIGKILL 信号,子进程仍继续无限期地运行,从而阻止了预期的关闭。这造成了重大障碍,因为关键操作(例如打印“等待完成”)从未执行。

经过进一步调查,问题的根本原因变得显而易见。 cmd.Process.Kill() 方法与其潜在的解释相反,不会终止子进程。

解决方案是在 Go 社区论坛 (https://groups.google.com/forum/ #!topic/golang-nuts/XoQ3RhFBJl8)。建议的修改涉及设置 exec.Command 结构的 SysProcAttr 字段,如下所示:

cmd := exec.Command(some_command)
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}

此外,syscall.Kill() 函数被修改为使用进程组 ID (pgid) 的负数来确保正确终止子进程。

pgid, err := syscall.Getpgid(cmd.Process.Pid)
if err == nil {
    syscall.Kill(-pgid, 15)  // note the minus sign
}

需要注意的是,此解决方案可能无法普遍适用于各个操作系统。虽然它已经在 macOS 上进行了测试,预计可以在大多数 Linux 发行版上运行,但它在 BSD 系统和 Windows 上的行为尚不确定。

以上是为什么 `cmd.Process.Kill()` 不杀死 Go 中的子进程,以及如何修复超时?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn