go - cmd.Process.Kill() 调用后进程不会终止

标签 go

我有一个程序可以跟踪文件更改,并且应该在文件更改时重新启动指定的进程。

我使用 cmd.Process.Kill() 来终止先前的进程,但在调用 Kill() 后它仍然保持事件状态。

与流程相关的一些代码从项目开始:

// ShellPlugin allows to run shell commands in task runner 
type ShellPlugin struct {
    scope  *scope.Scope
    params Params
    log    logging.Logger
    done chan bool
}

// Call calls a plugin
func (p *ShellPlugin) Call(tx *job.RunContext, r plugins.JobRunner) (err error) {
    defer close(p.done)

    // process: /bin/sh -c ping google.com
    cmd, err := p.params.createProcess(p.scope)
    if err != nil {
        return fmt.Errorf("failed to create process to execute command '%s': %s", p.params.Command, err)
    }

    p.log.Debug("command: '%s'", p.params.Command)
    p.log.Debug(`starting process "%s"...`, strings.Join(cmd.Args, " "))

    if err = cmd.Start(); err != nil {
        return fmt.Errorf(`failed to execute command "%s": %s`, strings.Join(cmd.Args, " "), err)
    }

    go func() {
        select {
        case <- p.done:
            p.log.Debug("received stop signal")
            if err := cmd.Process.Kill(); err != nil {
                p.log.Warn("kill: %s", err.Error())
            }
            p.log.Debug("Killed")
        }
    }()

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

    p.log.Debug("done")
    return nil
}

// Cancel called when task should be canceled
func (p *ShellPlugin) Cancel(ctx *job.RunContext) error {
    p.done <- true
    return nil
}

Call() 启 Action 业并 Cancel() 取消它。 两者都在单独的 goroutine 中调用。

完整源代码为here

最佳答案

问题是主进程 sh 被终止,但子进程 sleep 仍然存在。

解决方案是将进程组分配给主进程并杀死整个进程组。

// assign process group
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}

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

找到解决方案here

关于go - cmd.Process.Kill() 调用后进程不会终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55084214/

相关文章:

go - Go标准库中的最大堆和最小堆

go - 我的 go 二进制文件最终在 src 文件夹中

arrays - 迭代时更改值

go - 拆分io.Reader-使用ReadWriter吗?

regex - 解析正则表达式: invalid or unsupported Perl syntax: `?=` 时出错

pointers - 在指针接收器上调用 Elem() 方法以进行结构反射的必要性

go - 将 map 值转换为不带括号的纯字符串?

linux - 我如何在 Go 中列出 block 设备?

json - 为嵌入式结构使用自定义 JSON Marshal() 的问题

go - 返回返回类型匹配接口(interface)的回调时出错