子进程在终止后进行清理

时间:2017-04-14 08:47:14

标签: go

我想从go app运行另一个二进制文件,例如:

cmd := exec.Command("another_app_binary", "-config", "config.conf")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Run()

当我杀死父进程(上面的代码)时,子进程(another_app_binary)变成了孤儿。在父退出/终止后,我有什么选项来清理子进程?它必须有点平台,因为我计划在win / linux上运行它。

1 个答案:

答案 0 :(得分:1)

您可以使用os/signal包来监听当前进程中的终止信号。

import (
    "os/exec"
    "os"
    "os/signal"
)

// ...

cmd := exec.Command("another_app_binary", "-config", "config.conf")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Run()

c := make(chan os.Signal, 2)
signal.Notify(c, os.Interrupt, os.Kill)
go func() {
    <-c
    // cleanup
    cmd.Process.Kill()
    os.Exit(1)
}()

// ...