songzhibin97 4 жил өмнө
parent
commit
f14db2d4bc
1 өөрчлөгдсөн 27 нэмэгдсэн , 27 устгасан
  1. 27 27
      server/utils/cmd_Task.go

+ 27 - 27
server/utils/cmd_Task.go

@@ -2,11 +2,11 @@ package utils
 
 import (
 	"bytes"
+	"context"
 	"fmt"
 	"io"
 	"os"
 	"os/exec"
-	"path/filepath"
 	"runtime"
 	"sync"
 )
@@ -60,7 +60,6 @@ func (t *T) AddTask() {
 		// 直接丢弃这次任务
 		return
 	}
-	fmt.Println("::::发送任务->>>>>>>>")
 	t.ch <- struct{}{}
 }
 
@@ -72,10 +71,10 @@ func (t *T) RunTask() {
 	go t.f(ch)
 	for {
 		_, ok := <-t.ch
-		ch <- struct{}{}
 		if !ok {
 			return
 		}
+		ch <- struct{}{}
 		// 等待上一个关闭
 		<-t.closeChan
 		go t.f(ch)
@@ -85,21 +84,11 @@ func (t *T) RunTask() {
 
 // DefaultF: 默认的StartFunction
 func (t *T) DefaultF(ch chan struct{}) error {
-
 	var buildCmd *exec.Cmd
 	var cmd *exec.Cmd
 
-	// 判断是否有makefile
-	_, err := os.Stat(filepath.Join("Makefile"))
-	if runtime.GOOS != "windows" && err == nil {
-		_, err := exec.LookPath("make")
-		if err == nil {
-			cmd = exec.Command("make", "run")
-			goto makefile
-		}
-	}
 	// 检测系统是否有编译环境
-	_, err = exec.LookPath("go")
+	_, err := exec.LookPath("go")
 	if err != nil {
 		return err
 	}
@@ -111,54 +100,65 @@ func (t *T) DefaultF(ch chan struct{}) error {
 	default:
 		buildCmd = exec.Command("go", "build", "-o", "gva", "main.go")
 	}
+	//cmd = exec.Command("go", "run", "main.go")
 	err = buildCmd.Run()
 	if err != nil {
 		return err
 	}
 	fmt.Println("build 执行完成")
-
 	// 执行
-
 	switch runtime.GOOS {
 	case "windows":
 		cmd = exec.Command("gva.exe")
 	default:
 		cmd = exec.Command("./gva")
 	}
-makefile:
+
 	// 开始执行任务
-	t.echo(cmd)
+	ctx, cancel := context.WithCancel(context.Background())
+	err = t.echo(cmd, ctx)
 	<-ch
 	// 回收资源
-	err = cmd.Process.Kill()
-	fmt.Println("kill err", err)
+	fmt.Println("pid:", t.p.Pid, "->Kill")
+	err = t.p.Kill()
+	cancel()
 	// 发送关闭完成信号
 	t.closeChan <- struct{}{}
 	return err
 }
 
 // echo: 封装回显
-func (t *T) echo(cmd *exec.Cmd) error {
+func (t *T) echo(cmd *exec.Cmd, ctx context.Context) error {
 	var stdoutBuf bytes.Buffer
 	stdoutIn, _ := cmd.StdoutPipe()
-	var errStdout, errStderr error
+	var errStdout error
 	stdout := io.MultiWriter(os.Stdout, &stdoutBuf)
 	err := cmd.Start()
 	if err != nil {
 		return err
 	}
-	go func() {
+	go func(ctx context.Context) {
 		_, errStdout = io.Copy(stdout, stdoutIn)
-	}()
+		select {
+		case <-ctx.Done():
+			return
+		default:
+		}
+	}(ctx)
 	t.p = cmd.Process
 	fmt.Println("pid", t.p.Pid)
 	go func() {
 		_ = cmd.Wait()
-		if errStdout != nil || errStderr != nil {
+		if errStdout != nil {
 			fmt.Printf("failed to capture stdout or stderr\n")
 		}
-		outStr := string(stdoutBuf.Bytes())
-		fmt.Printf("\nout:\n%s\n", outStr)
+		fmt.Printf("%s\n", string(stdoutBuf.Bytes()))
+		select {
+		case <-ctx.Done():
+			_ = os.Stdout.Close()
+			return
+		default:
+		}
 	}()
 	return nil
 }