From b5a0b0ff160e460965344d94e55141527e030ccb Mon Sep 17 00:00:00 2001 From: naiba Date: Fri, 29 Jan 2021 11:59:35 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=A6=20[agent=20v0.3.7]=20=20fix:=20cro?= =?UTF-8?q?ss=20compile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/agent/main.go | 26 +++++++------------ cmd/playground/main.go | 40 +++++++++-------------------- pkg/utils/proccess_group.go | 31 ++++++++++++++++++++++ pkg/utils/proccess_group_darwin.go | 20 --------------- pkg/utils/proccess_group_linux.go | 20 --------------- pkg/utils/proccess_group_windows.go | 8 +++--- 6 files changed, 57 insertions(+), 88 deletions(-) create mode 100644 pkg/utils/proccess_group.go delete mode 100644 pkg/utils/proccess_group_darwin.go delete mode 100644 pkg/utils/proccess_group_linux.go diff --git a/cmd/agent/main.go b/cmd/agent/main.go index 02e3fc7..6484781 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -11,7 +11,6 @@ import ( "os" "os/exec" "strings" - "syscall" "time" "github.com/blang/semver" @@ -234,32 +233,25 @@ func doTask(task *pb.Task) { startedAt := time.Now() var cmd *exec.Cmd var endCh = make(chan struct{}) - var pg utils.ProcessExitGroup + pg, err := utils.NewProcessExitGroup() + if err != nil { + // 进程组创建失败,直接退出 + result.Data = err.Error() + client.ReportTask(ctx, &result) + return + } timeout := time.NewTimer(time.Hour * 2) if utils.IsWindows() { - var err error - pg, err = utils.NewProcessExitGroup() - if err != nil { - // Windows 进程组创建失败,直接退出 - result.Data = err.Error() - client.ReportTask(ctx, &result) - return - } cmd = exec.Command("cmd", "/c", task.GetData()) - pg.AddProcess(cmd.Process) } else { cmd = exec.Command("sh", "-c", task.GetData()) - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} } + pg.AddProcess(cmd) go func() { select { case <-timeout.C: result.Data = "任务执行超时\n" - if utils.IsWindows() { - pg.Dispose() - } else { - cmd.Process.Kill() - } + pg.Dispose() close(endCh) case <-endCh: } diff --git a/cmd/playground/main.go b/cmd/playground/main.go index 56c8c18..e6c581f 100644 --- a/cmd/playground/main.go +++ b/cmd/playground/main.go @@ -8,7 +8,6 @@ import ( "net/http" "os" "os/exec" - "syscall" "time" "github.com/go-ping/ping" @@ -80,40 +79,25 @@ func cmdExec() { panic(err) } var cmd *exec.Cmd - var pg utils.ProcessExitGroup + pg, err := utils.NewProcessExitGroup() + if err != nil { + panic(err) + } if utils.IsWindows() { - pg, err = utils.NewProcessExitGroup() - if err != nil { - panic(err) - } cmd = exec.Command("cmd", "/c", execFrom+"/cmd/playground/example.sh hello asd") - pg.AddProcess(cmd.Process) } else { cmd = exec.Command("sh", "-c", execFrom+`/cmd/playground/example.sh hello && \ -echo world!`) - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + echo world!`) } - var endCh = make(chan struct{}) - go func() { - output, err := cmd.Output() - log.Println("output:", string(output)) - log.Println("err:", err) - close(endCh) - }() + pg.AddProcess(cmd) go func() { time.Sleep(time.Second * 2) - fmt.Println("killed") - if utils.IsWindows() { - if err := pg.Dispose(); err != nil { - panic(err) - } - } else { - if err := syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL); err != nil { - panic(err) - } + if err = pg.Dispose(); err != nil { + panic(err) } + fmt.Println("killed") }() - select { - case <-endCh: - } + output, err := cmd.Output() + log.Println("output:", string(output)) + log.Println("err:", err) } diff --git a/pkg/utils/proccess_group.go b/pkg/utils/proccess_group.go new file mode 100644 index 0000000..4d42f5a --- /dev/null +++ b/pkg/utils/proccess_group.go @@ -0,0 +1,31 @@ +// +build !windows + +package utils + +import ( + "os/exec" + "syscall" +) + +type ProcessExitGroup struct { + cmds []*exec.Cmd +} + +func NewProcessExitGroup() (ProcessExitGroup, error) { + return ProcessExitGroup{}, nil +} + +func (g ProcessExitGroup) Dispose() error { + for _, c := range g.cmds { + if err := syscall.Kill(-c.Process.Pid, syscall.SIGKILL); err != nil { + return err + } + } + return nil +} + +func (g *ProcessExitGroup) AddProcess(cmd *exec.Cmd) error { + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + g.cmds = append(g.cmds, cmd) + return nil +} diff --git a/pkg/utils/proccess_group_darwin.go b/pkg/utils/proccess_group_darwin.go deleted file mode 100644 index 04029bc..0000000 --- a/pkg/utils/proccess_group_darwin.go +++ /dev/null @@ -1,20 +0,0 @@ -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") -} diff --git a/pkg/utils/proccess_group_linux.go b/pkg/utils/proccess_group_linux.go deleted file mode 100644 index 04029bc..0000000 --- a/pkg/utils/proccess_group_linux.go +++ /dev/null @@ -1,20 +0,0 @@ -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") -} diff --git a/pkg/utils/proccess_group_windows.go b/pkg/utils/proccess_group_windows.go index 0355ec7..19ba77f 100644 --- a/pkg/utils/proccess_group_windows.go +++ b/pkg/utils/proccess_group_windows.go @@ -1,7 +1,9 @@ +// +build windows + package utils import ( - "os" + "os/exec" "unsafe" "golang.org/x/sys/windows" @@ -42,8 +44,8 @@ func (g ProcessExitGroup) Dispose() error { return windows.CloseHandle(windows.Handle(g)) } -func (g ProcessExitGroup) AddProcess(p *os.Process) error { +func (g ProcessExitGroup) AddProcess(cmd *exec.Cmd) error { return windows.AssignProcessToJobObject( windows.Handle(g), - windows.Handle((*process)(unsafe.Pointer(p)).Handle)) + windows.Handle((*process)(unsafe.Pointer(cmd.Process)).Handle)) }