Go语言 如果父进程终止,则终止exec

toe95027  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(207)

我有一段围棋代码,比如:

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

即使主进程结束了,sleep命令仍将处于活动状态,是否可以将它们链接起来,以便在父进程被终止时cmd将被终止?

oaxa6hgo

oaxa6hgo1#

如果您希望在程序退出时终止启动的进程,则可以注入一个上下文:

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

这段代码的工作原理是创建一个带有cancel函数的上下文。然后,这个上下文被发送到Foo,并从那里发送到command函数。当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")
}

相关问题