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