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