为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 不能杀死子进程的父进程

Golang 不能杀死子进程的父进程

Go
Cats萌萌 2021-08-16 19:10:39
最后几天,我有点挣扎于分叉进程并从分叉的进程(子进程)中杀死父进程我不知道为什么,但似乎根本没有杀死父母。首先,由于正常关闭过程而使进程保持运行的开放连接,我很难解决,但这不是那个问题。如果我从终端向父级发送 SIGTERM,它运行得很好,但是当子级发送 SIGTERM 时它不会停止,强制退出不是正常关闭的选择原因。编辑 * 进程仍在进程列表中。也许那是为了让父母跟踪它的孩子?一些执行分叉的代码,也许我在这里做错了什么func (s *Server) Upgrade() error {    tl := s.listener.(*listener)    addr := s.listener.Addr()    name := fmt.Sprintf("%s:%s->", addr.Network(), addr.String())    os.Setenv("PROX_NAME", name)    fl, err := tl.File()    if err != nil {        return fmt.Errorf("Failed to extract file desciptor, %v", err)    }    fd := fl.Fd()    argv0, err := exec.LookPath(os.Args[0])    if err != nil {        return fmt.Errorf("Failed to execute lookpath, %v", err)    }    noCloseOnExec(fd)    files := make([]*os.File, fd+1)    files[syscall.Stdin] = os.Stdin    files[syscall.Stdout] = os.Stdout    files[syscall.Stderr] = os.Stderr    files[fd] = os.NewFile(fd, name)    wd, err := os.Getwd()    if err != nil {        return err    }    os.Setenv("GPROXY_FD", fmt.Sprintf("%d", fd))    os.Setenv("GPROXY_PID", fmt.Sprintf("%d", syscall.Getpid()))    args := []string{"gproxy", "-debug", "start"}    _, err = os.StartProcess(argv0, args, &os.ProcAttr{        Dir:   wd,        Env:   os.Environ(),        Files: files,    })    return err}父母的终止func termParentProcess() error {    pid := syscall.Getppid()    return syscall.Kill(pid, syscall.SIGTERM)}
查看完整描述

2 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

我的父进程不会在 TERM 信号上终止的问题是因为内部 for 循环不会中断。我修复了 for 循环并让 main 函数返回。如果在 Go 中 main 返回,则程序退出。很抱歉因为我自己的一个大错误而打扰你们


查看完整回答
反对 回复 2021-08-16
  • 2 回答
  • 0 关注
  • 322 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信