gpt4 book ai didi

go - 在 Go 代码中,如何在超时时终止进程及其子进程?

转载 作者:IT王子 更新时间:2023-10-29 01:10:33 26 4
gpt4 key购买 nike

我有一种情况,我需要在一段时间后终止一个进程。我开始这个过程,然后:

case <-time.After(timeout):
if err := cmd.Process.Kill(); err != nil {
return 0, fmt.Errorf("Failed to kill process: %v", err)
}

终止进程。但它只会杀死父进程,而不是主进程启动的 5-10 个子进程。我还尝试创建一个流程组,然后执行以下操作:

syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL)

杀死主进程和孙进程,但不起作用。有没有其他方法可以终止进程。

最佳答案

我想这就是你需要的:

cmd := exec.Command(command, arguments...)

// This sets up a process group which we kill later.
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}

if err := cmd.Start(); err != nil {
return err
}

// buffered chan is important so the goroutine does't
// get blocked and stick around if the function returns
// after the timeout
done := make(chan error, 1)

go func() {
done <- cmd.Wait()
}()

select {
case err := <-done:
// this will be nil if no error
return err
case <-time.After(time.Second):
// We created a process group above which we kill here.
pgid, err := syscall.Getpgid(cmd.Process.Pid)
if err != nil {
return err
}
// note the minus sign
if err := syscall.Kill(-pgid, 15); err != nil {
return err
}
return fmt.Errorf("Timeout")
}

关于go - 在 Go 代码中,如何在超时时终止进程及其子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32921792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com