2014-09-18 2 views
0

В последние дни я свой роде борющиеся с порождая процесс и убить родитель с раздвоенным одного (ребенка)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) 
} 
+0

В чем смысл этой функции 'termParentProcess'? Есть ошибка проверки без каких-либо определений? – JimB

+0

hmm thats моя ошибка я его отредактировал –

ответ

2

Короче говоря, вы не можете раскошелиться, там очень старая и текущая проблема для него here.

Вы можете использовать что-то наподобие https://github.com/icattlecoder/godaemon, но родитель должен будет сам себя не закончить.

var isChild = flag.Bool("child", false, "parent pid") 

func main() { 
    flag.Parse() 
    var s string 
    if !*isChild { //parent 
     fmt.Println("forking") 
     files := make([]*os.File, 3) 
     files[syscall.Stdin] = os.Stdin 
     files[syscall.Stdout] = os.Stdout 
     files[syscall.Stderr] = os.Stderr 
     fmt.Println(os.StartProcess(os.Args[0], append(os.Args, "-child"), &os.ProcAttr{ 
      Dir: "/tmp", 
      Env: os.Environ(), 
      Files: files, 
     })) 
     fmt.Scan(&s) // block 
    } else { 
     ppid := os.Getppid() 
     fmt.Println("ppid", ppid, "kill:", syscall.Kill(ppid, syscall.SIGTERM)) 
     time.Sleep(5 * time.Second) 
     fmt.Println("child dying") 
    } 
} 
+0

Я не думаю, что он действительно хочет «развиваться». Он пытается выполнить новый процесс (который, как раз бывает, os.Args [0]), и в какой-то момент в будущем он убьет родителя. – JimB

+0

@JimB Я неправильно понял вопрос, во всяком случае, это было os.Getppid, будучи напуганным. – OneOfOne

+0

, если Getppid возвращает 1, ваш родитель уже вышел. – JimB

1

Проблема мой родительский процесс обыкновение оканчиваются на сигнал TERM происходит из-за внутренней цикл, который не сломают. Я исправил цикл for и вернул основную функцию. Если в поле «Перейти» основное возвращается, программа завершает работу. жаль беспокоить вас, ребята, с большой ошибкой себя

Смежные вопросы