From d045b2631ccc50bc4297cb4742833a9bc3e4579d Mon Sep 17 00:00:00 2001 From: Doflatango Date: Sat, 15 Sep 2018 20:58:16 +0800 Subject: [PATCH] Force kill a group of processes --- job.go | 29 +++++++++++++++++------------ node/node.go | 2 +- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/job.go b/job.go index 3341f62..5fefaf7 100644 --- a/job.go +++ b/job.go @@ -422,12 +422,10 @@ func (j *Job) Run() bool { t := time.Now() - if len(j.User) > 0 { - sysProcAttr, err = j.CreateCmdAttr() - if err != nil { - j.Fail(t, err.Error()) - return false - } + sysProcAttr, err = j.CreateCmdAttr() + if err != nil { + j.Fail(t, err.Error()) + return false } // 超时控制 @@ -438,6 +436,7 @@ func (j *Job) Run() bool { } else { cmd = exec.Command(j.cmd[0], j.cmd[1:]...) } + cmd.SysProcAttr = sysProcAttr var b bytes.Buffer cmd.Stdout = &b @@ -713,7 +712,13 @@ func (j *Job) ShortName() string { } func (j *Job) CreateCmdAttr() (*syscall.SysProcAttr, error) { - var sysProcAttr *syscall.SysProcAttr + sysProcAttr := &syscall.SysProcAttr{ + Setpgid: true, + } + + if len(j.User) == 0 { + return sysProcAttr, nil + } u, err := user.Lookup(j.User) if err != nil { @@ -724,15 +729,15 @@ func (j *Job) CreateCmdAttr() (*syscall.SysProcAttr, error) { if err != nil { return nil, errors.New("not support run with user on windows") } + if uid != _Uid { gid, _ := strconv.Atoi(u.Gid) - sysProcAttr = &syscall.SysProcAttr{ - Credential: &syscall.Credential{ - Uid: uint32(uid), - Gid: uint32(gid), - }, + sysProcAttr.Credential = &syscall.Credential{ + Uid: uint32(uid), + Gid: uint32(gid), } } + return sysProcAttr, nil } diff --git a/node/node.go b/node/node.go index 690f4e8..617e034 100644 --- a/node/node.go +++ b/node/node.go @@ -423,7 +423,7 @@ func (n *Node) groupRmNode(g, og *cronsun.Group) { func (n *Node) KillExcutingProc(process *cronsun.Process) { pid, _ := strconv.Atoi(process.ID) - if err := syscall.Kill(pid, syscall.SIGKILL); err != nil { + if err := syscall.Kill(-pid, syscall.SIGKILL); err != nil { log.Warnf("process:[%d] force kill failed, error:[%s]\n", pid, err) return }