如果父进程终止则 kill exec

我有一段代码如下:


func Foo() {

    cmd := exec.Command("command that takes a long time")

    err = cmd.Start()

    if err != nil {

        panic(err)

    }



    return

}


func main() {

    Foo()


    panic("program quit abruptly")

}

即使主进程结束,睡眠命令仍将处于活动状态,是否可以链接这些,以便cmd如果父进程被杀死?


喵喵时光机
浏览 129回答 1
1回答

红颜莎娜

如果您希望在程序退出时终止您启动的进程,那么您可以注入一个上下文:func Foo(ctx context.Context) {    cmd := exec.CommandContext(ctx, "command that takes a long time")    _ = cmd.Start()    return}func main() {    ctx, cancel := context.WithCancel(context.Background())    Foo(ctx)    defer cancel()    panic("program quit abruptly")}这段代码通过创建一个带有取消函数的上下文来工作。然后将此上下文发送到Foo命令函数并从那里发送到命令函数。当cancel被调用时,上下文会被取消,导致子进程被杀死。为确保取消上下文,我们将调用推迟到cancel,这可确保在程序出于任何原因(包括恐慌)退出时取消上下文。如果你的愿望是只在恐慌时取消,你可以main稍微修改一下:func main() {    ctx, cancel := context.WithCancel(context.Background())    Foo(ctx)    defer func() {        if r := recover(); r != nil {            cancel()        }    }()    panic("program quit abruptly")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go