亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

調用 cmd.Process.Kill() 后進程不會終止

調用 cmd.Process.Kill() 后進程不會終止

Go
慕桂英4014372 2023-06-12 17:03:29
我有一個跟蹤文件更改的程序,應該在文件更改時重新啟動指定的進程。我過去常常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 pluginfunc (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 canceledfunc (p *ShellPlugin) Cancel(ctx *job.RunContext) error {    p.done <- true    return nil}Call()開始工作并Cancel()取消它。兩者都調用了單獨的 goroutine。完整的源代碼在這里
查看完整描述

1 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

問題是主進程sh被殺死但子進程sleep仍然存在。


解決方案是將進程組分配給主進程并殺死整個進程組。


// assign process group

cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}


// Kill pg

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

查看完整回答
反對 回復 2023-06-12
  • 1 回答
  • 0 關注
  • 315 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號