gpt4 book ai didi

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

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

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

我使用 cmd.Process.Kill() 杀死之前的进程,但它在调用 Kill() 后仍然存在。

一些与process start from project相关的代码:

// 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 中调用。

完整的源代码是 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/

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