В последние дни я свой роде борющиеся с порождая процесс и убить родитель с раздвоенным одного (ребенка)Golang не может убить родительский процесс от ребенка
Я не знаю, почему, но мне кажется, чтобы не убить родитель в все. сначала я жестко его, где открытые соединения, которые поддерживают процесс, из-за грациозного завершения процесса, Но это не проблема.
Если я отправлю 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)
}
В чем смысл этой функции 'termParentProcess'? Есть ошибка проверки без каких-либо определений? – JimB
hmm thats моя ошибка я его отредактировал –