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

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

Patricia Arquette
发布: 2024-12-09 15:08:17
原创
218 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板