go - 子进程终止后清理

标签 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 上运行它。

最佳答案

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

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)
}()

// ...

关于go - 子进程终止后清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43408212/

相关文章:

go - Golang花括号内发生了什么

go generate with gofmt,替换变量值

mysql - 如何测试使用数据库(mysql)的 Go 代码?

loops - 如何在不运行以下脚本的情况下退出循环

go - "Bounded"在编程中的含义

go - 向 exec.Cmd.StdinPipe() 写入超过 4K 字节

go - 如何制作自己的枚举

go - Goroutine在 channel 上收听相同的结果

algorithm - 使用 golang 在图中查找 Cliques

string - golang 将 os.ModePerm 转换为字符串