首页 > 后端开发 > Golang > 为什么 `Process.Signal` 不杀死 Go 中的子进程?

为什么 `Process.Signal` 不杀死 Go 中的子进程?

Barbara Streisand
发布: 2024-11-27 17:37:15
原创
349 人浏览过

Why Doesn't `Process.Signal` Kill Child Processes in Go?

为什么不使用 Process.Signal 杀死子进程?

在提供的代码片段中,该进程应该是在指定的超时后使用 cmd.Process.Signal(syscall.SIGKILL) 杀死。但是,超时无法正常工作。尽管打印了“It's dead Jim”,但该过程仍在继续运行,并且永远不会打印“Done waiting”。

问题

这里的问题与事实有关cmd.Process.Signal 不会杀死子进程。子进程有自己的进程组,需要单独杀死。

解决方案

要解决此问题,可以使用 syscall.Getpgid 和syscall.Kill:

import "syscall"

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

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

cmd.Wait()
登录后复制

通过使用SysProcAttr.Setpgid = true,一个单独的进程组是为子进程创建的。然后,syscall.Getpgid 检索子进程的进程组 ID (pgid)。最后,调用 syscall.Kill(-pgid, 15) 向整个进程组发送 SIGTERM 信号,有效杀死子进程及其子进程。

注意事项

此解决方案可能不适用于所有平台。它已被证实可在 macOS 和 Linux 上运行,但其在其他操作系统上的行为尚不确定。

以上是为什么 `Process.Signal` 不杀死 Go 中的子进程?的详细内容。更多信息请关注PHP中文网其他相关文章!

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