📦 [agent v0.3.7] fix: cross compile
This commit is contained in:
		
							parent
							
								
									0f24c0d7ef
								
							
						
					
					
						commit
						b5a0b0ff16
					
				@ -11,7 +11,6 @@ import (
 | 
				
			|||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/exec"
 | 
						"os/exec"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"syscall"
 | 
					 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/blang/semver"
 | 
						"github.com/blang/semver"
 | 
				
			||||||
@ -234,32 +233,25 @@ func doTask(task *pb.Task) {
 | 
				
			|||||||
		startedAt := time.Now()
 | 
							startedAt := time.Now()
 | 
				
			||||||
		var cmd *exec.Cmd
 | 
							var cmd *exec.Cmd
 | 
				
			||||||
		var endCh = make(chan struct{})
 | 
							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)
 | 
							timeout := time.NewTimer(time.Hour * 2)
 | 
				
			||||||
		if utils.IsWindows() {
 | 
							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())
 | 
								cmd = exec.Command("cmd", "/c", task.GetData())
 | 
				
			||||||
			pg.AddProcess(cmd.Process)
 | 
					 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			cmd = exec.Command("sh", "-c", task.GetData())
 | 
								cmd = exec.Command("sh", "-c", task.GetData())
 | 
				
			||||||
			cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							pg.AddProcess(cmd)
 | 
				
			||||||
		go func() {
 | 
							go func() {
 | 
				
			||||||
			select {
 | 
								select {
 | 
				
			||||||
			case <-timeout.C:
 | 
								case <-timeout.C:
 | 
				
			||||||
				result.Data = "任务执行超时\n"
 | 
									result.Data = "任务执行超时\n"
 | 
				
			||||||
				if utils.IsWindows() {
 | 
									pg.Dispose()
 | 
				
			||||||
					pg.Dispose()
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					cmd.Process.Kill()
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				close(endCh)
 | 
									close(endCh)
 | 
				
			||||||
			case <-endCh:
 | 
								case <-endCh:
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,6 @@ import (
 | 
				
			|||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/exec"
 | 
						"os/exec"
 | 
				
			||||||
	"syscall"
 | 
					 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/go-ping/ping"
 | 
						"github.com/go-ping/ping"
 | 
				
			||||||
@ -80,40 +79,25 @@ func cmdExec() {
 | 
				
			|||||||
		panic(err)
 | 
							panic(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var cmd *exec.Cmd
 | 
						var cmd *exec.Cmd
 | 
				
			||||||
	var pg utils.ProcessExitGroup
 | 
						pg, err := utils.NewProcessExitGroup()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							panic(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if utils.IsWindows() {
 | 
						if utils.IsWindows() {
 | 
				
			||||||
		pg, err = utils.NewProcessExitGroup()
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			panic(err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		cmd = exec.Command("cmd", "/c", execFrom+"/cmd/playground/example.sh hello asd")
 | 
							cmd = exec.Command("cmd", "/c", execFrom+"/cmd/playground/example.sh hello asd")
 | 
				
			||||||
		pg.AddProcess(cmd.Process)
 | 
					 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		cmd = exec.Command("sh", "-c", execFrom+`/cmd/playground/example.sh hello && \
 | 
							cmd = exec.Command("sh", "-c", execFrom+`/cmd/playground/example.sh hello && \
 | 
				
			||||||
echo world!`)
 | 
								echo world!`)
 | 
				
			||||||
		cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var endCh = make(chan struct{})
 | 
						pg.AddProcess(cmd)
 | 
				
			||||||
	go func() {
 | 
					 | 
				
			||||||
		output, err := cmd.Output()
 | 
					 | 
				
			||||||
		log.Println("output:", string(output))
 | 
					 | 
				
			||||||
		log.Println("err:", err)
 | 
					 | 
				
			||||||
		close(endCh)
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
	go func() {
 | 
						go func() {
 | 
				
			||||||
		time.Sleep(time.Second * 2)
 | 
							time.Sleep(time.Second * 2)
 | 
				
			||||||
		fmt.Println("killed")
 | 
							if err = pg.Dispose(); err != nil {
 | 
				
			||||||
		if utils.IsWindows() {
 | 
								panic(err)
 | 
				
			||||||
			if err := pg.Dispose(); err != nil {
 | 
					 | 
				
			||||||
				panic(err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			if err := syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL); err != nil {
 | 
					 | 
				
			||||||
				panic(err)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							fmt.Println("killed")
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
	select {
 | 
						output, err := cmd.Output()
 | 
				
			||||||
	case <-endCh:
 | 
						log.Println("output:", string(output))
 | 
				
			||||||
	}
 | 
						log.Println("err:", err)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										31
									
								
								pkg/utils/proccess_group.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								pkg/utils/proccess_group.go
									
									
									
									
									
										Normal file
									
								
							@ -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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -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")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -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")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,7 +1,9 @@
 | 
				
			|||||||
 | 
					// +build windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package utils
 | 
					package utils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"os"
 | 
						"os/exec"
 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"golang.org/x/sys/windows"
 | 
						"golang.org/x/sys/windows"
 | 
				
			||||||
@ -42,8 +44,8 @@ func (g ProcessExitGroup) Dispose() error {
 | 
				
			|||||||
	return windows.CloseHandle(windows.Handle(g))
 | 
						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(
 | 
						return windows.AssignProcessToJobObject(
 | 
				
			||||||
		windows.Handle(g),
 | 
							windows.Handle(g),
 | 
				
			||||||
		windows.Handle((*process)(unsafe.Pointer(p)).Handle))
 | 
							windows.Handle((*process)(unsafe.Pointer(cmd.Process)).Handle))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user