猿问

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

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


我过去常常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()开始工作并Cancel()取消它。两者都调用了单独的 goroutine。


完整的源代码在这里


慕桂英4014372
浏览 261回答 1
1回答

凤凰求蛊

问题是主进程sh被杀死但子进程sleep仍然存在。解决方案是将进程组分配给主进程并杀死整个进程组。// assign process groupcmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}// Kill pgsyscall.Kill(-cmd.Process.Pid, syscall.SIGKILL)
随时随地看视频慕课网APP

相关分类

Go
我要回答