最后幾天,我有點掙扎于分叉進程并從分叉的進程(子進程)中殺死父進程我不知道為什么,但似乎根本沒有殺死父母。首先,由于正常關閉過程而使進程保持運行的開放連接,我很難解決,但這不是那個問題。如果我從終端向父級發送 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 返回,則程序退出。很抱歉因為我自己的一個大錯誤而打擾你們
- 2 回答
- 0 關注
- 345 瀏覽
添加回答
舉報
0/150
提交
取消