即使在设置了进程组pid之后,Go也不会杀死基于GUI的进程

  • 本文关键字:进程 GUI 设置 之后 pid Go go unix
  • 更新时间 :
  • 英文 :


所以我想启动一个进程并用我的Go代码杀死它。这是代码

package main
import (
"fmt"
"os/exec"
"syscall"
)
func main() {
cmd := exec.Command("subl")
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
err := cmd.Start()
if err != nil {
fmt.Println(err)
return
}
// wait for the process to complete
err = cmd.Wait()
if err != nil {
fmt.Println(err)
}
time.Sleep(3 * time.Second)
pgid, err := syscall.Getpgid(cmd.Process.Pid)
if err != nil {
fmt.Println(cmd, " can't kill ", err)
}
syscall.Kill(-pgid, 15)
}

我在阅读这个答案后设置了组进程id,希望它能起作用为什么会赢';t正确地杀死一个子进程?

但是,如果我打开像firefox这样的进程,或者升华它会启动它们,但不能通过说no such process来杀死它们,但在程序退出后,我仍然可以看到浏览器或编辑器窗口打开。如何正确地终止此类进程?即使正在运行也会完成的进程。

您的代码等待进程完成,然后试图杀死它。肯定没有进程可以杀死吗?我预计,浏览器或其他应用程序正在从iteself生成一个新进程,然后退出原始进程,也就是您的代码返回的时候。浏览器仍在运行,但产生它的进程已经死了。

这在只运行一个主进程的应用程序中很常见,例如,如果您启动3个浏览器进程,它们将向第一个进程发出打开新选项卡的信号。

最新更新