[agent v0.3.6] 🐛 fix: kill process group

This commit is contained in:
naiba
2021-01-29 11:11:39 +08:00
parent e439747c09
commit 0f24c0d7ef
6 changed files with 121 additions and 5 deletions

View File

@@ -0,0 +1,20 @@
package utils
import (
"errors"
"os"
)
type ProcessExitGroup struct{}
func NewProcessExitGroup() (ProcessExitGroup, error) {
return ProcessExitGroup{}, errors.New("not implement")
}
func (g ProcessExitGroup) Dispose() error {
return errors.New("not implement")
}
func (g ProcessExitGroup) AddProcess(p *os.Process) error {
return errors.New("not implement")
}

View File

@@ -0,0 +1,20 @@
package utils
import (
"errors"
"os"
)
type ProcessExitGroup struct{}
func NewProcessExitGroup() (ProcessExitGroup, error) {
return ProcessExitGroup{}, errors.New("not implement")
}
func (g ProcessExitGroup) Dispose() error {
return errors.New("not implement")
}
func (g ProcessExitGroup) AddProcess(p *os.Process) error {
return errors.New("not implement")
}

View File

@@ -0,0 +1,49 @@
package utils
import (
"os"
"unsafe"
"golang.org/x/sys/windows"
)
// We use this struct to retreive process handle(which is unexported)
// from os.Process using unsafe operation.
type process struct {
Pid int
Handle uintptr
}
type ProcessExitGroup windows.Handle
func NewProcessExitGroup() (ProcessExitGroup, error) {
handle, err := windows.CreateJobObject(nil, nil)
if err != nil {
return 0, err
}
info := windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION{
BasicLimitInformation: windows.JOBOBJECT_BASIC_LIMIT_INFORMATION{
LimitFlags: windows.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE,
},
}
if _, err := windows.SetInformationJobObject(
handle,
windows.JobObjectExtendedLimitInformation,
uintptr(unsafe.Pointer(&info)),
uint32(unsafe.Sizeof(info))); err != nil {
return 0, err
}
return ProcessExitGroup(handle), nil
}
func (g ProcessExitGroup) Dispose() error {
return windows.CloseHandle(windows.Handle(g))
}
func (g ProcessExitGroup) AddProcess(p *os.Process) error {
return windows.AssignProcessToJobObject(
windows.Handle(g),
windows.Handle((*process)(unsafe.Pointer(p)).Handle))
}