Процесс не умирает после вызова cmd.Process.Kill () - PullRequest
2 голосов
/ 10 марта 2019

У меня есть программа, которая отслеживает изменение файла и должна перезапустить указанный процесс при изменении файла.

Я использую 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() отменяет его.Оба вызываются в отдельной программе.

Полный исходный код здесь

1 Ответ

2 голосов
/ 10 марта 2019

Проблема заключалась в том, что основной процесс sh был убит, но дочерний процесс sleep был еще жив.

Решением было назначить группу процессов основному процессу и уничтожить целую группу процессов.

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

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

Решение найдено здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...