Force kill a group of processes

pull/106/head
Doflatango 2018-09-15 20:58:16 +08:00
parent bf22fa82cc
commit d045b2631c
2 changed files with 18 additions and 13 deletions

17
job.go
View File

@ -422,13 +422,11 @@ 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
}
}
// 超时控制
if j.Timeout > 0 {
@ -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{
sysProcAttr.Credential = &syscall.Credential{
Uid: uint32(uid),
Gid: uint32(gid),
},
}
}
return sysProcAttr, nil
}

View File

@ -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
}