mirror of
https://github.com/Buriburizaem0n/nezha_domains.git
synced 2026-02-04 12:40:07 +00:00
[agent v0.3.6] 🐛 fix: kill process group
This commit is contained in:
20
pkg/utils/proccess_group_darwin.go
Normal file
20
pkg/utils/proccess_group_darwin.go
Normal 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")
|
||||
}
|
||||
20
pkg/utils/proccess_group_linux.go
Normal file
20
pkg/utils/proccess_group_linux.go
Normal 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")
|
||||
}
|
||||
49
pkg/utils/proccess_group_windows.go
Normal file
49
pkg/utils/proccess_group_windows.go
Normal 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))
|
||||
}
|
||||
Reference in New Issue
Block a user