From feda43650c92aea33118d8cf8e33e3fc13620a0e Mon Sep 17 00:00:00 2001 From: zkqiang Date: Sun, 20 Sep 2020 12:35:21 +0800 Subject: [PATCH] fixed build error of windows --- backend/services/sys_exec/linux_mac.go | 30 ++++++++++++++++++++++++++ backend/services/sys_exec/windows.go | 24 +++++++++++++++++++++ backend/services/task.go | 25 +++++---------------- 3 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 backend/services/sys_exec/linux_mac.go create mode 100644 backend/services/sys_exec/windows.go diff --git a/backend/services/sys_exec/linux_mac.go b/backend/services/sys_exec/linux_mac.go new file mode 100644 index 00000000..394dce47 --- /dev/null +++ b/backend/services/sys_exec/linux_mac.go @@ -0,0 +1,30 @@ +// +build !windows + +package sys_exec + +import ( + "os/exec" + "syscall" +) + +func BuildCmd(cmdStr string) *exec.Cmd { + return exec.Command("sh", "-c", cmdStr) +} + +func Setpgid(cmd *exec.Cmd) { + if cmd == nil { + return + } + if cmd.SysProcAttr == nil { + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + } else { + cmd.SysProcAttr.Setpgid = true + } +} + +func KillProcess(cmd *exec.Cmd) error { + if cmd == nil { + return nil + } + return syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) +} diff --git a/backend/services/sys_exec/windows.go b/backend/services/sys_exec/windows.go new file mode 100644 index 00000000..63199b09 --- /dev/null +++ b/backend/services/sys_exec/windows.go @@ -0,0 +1,24 @@ +// +build windows + +package sys_exec + +import ( + "os/exec" +) + +func BuildCmd(cmdStr string) *exec.Cmd { + return exec.Command("cmd", "/C", cmdStr) +} + +func Setpgid(cmd *exec.Cmd) { + return +} + +func KillProcess(cmd *exec.Cmd) error { + if cmd != nil && cmd.Process != nil { + if err := cmd.Process.Kill(); err != nil { + return err + } + } + return nil +} diff --git a/backend/services/task.go b/backend/services/task.go index 24421442..78eb576a 100644 --- a/backend/services/task.go +++ b/backend/services/task.go @@ -10,6 +10,7 @@ import ( "crawlab/services/notification" "crawlab/services/rpc" "crawlab/services/spider_handler" + "crawlab/services/sys_exec" "crawlab/utils" "encoding/json" "errors" @@ -24,12 +25,10 @@ import ( "os" "os/exec" "path/filepath" - "runtime" "runtime/debug" "strconv" "strings" "sync" - "syscall" "time" ) @@ -281,15 +280,8 @@ func FinishOrCancelTask(ch chan string, cmd *exec.Cmd, s model.Spider, t model.T log.Infof("process received signal: %s", signal) if signal == constants.TaskCancel && cmd.Process != nil { - var err error - // 兼容windows - if runtime.GOOS == constants.Windows { - err = cmd.Process.Kill() - } else { - err = syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) - } - // 取消进程 - if err != nil { + // 终止进程 + if err := sys_exec.KillProcess(cmd); err != nil { log.Errorf("process kill error: %s", err.Error()) debug.PrintStack() @@ -359,12 +351,7 @@ func ExecuteShellCmd(cmdStr string, cwd string, t model.Task, s model.Spider, u wg := &sync.WaitGroup{} // 生成执行命令 - var cmd *exec.Cmd - if runtime.GOOS == constants.Windows { - cmd = exec.Command("cmd", "/C", cmdStr) - } else { - cmd = exec.Command("sh", "-c", cmdStr) - } + cmd := sys_exec.BuildCmd(cmdStr) // 工作目录 cmd.Dir = cwd @@ -395,9 +382,7 @@ func ExecuteShellCmd(cmdStr string, cwd string, t model.Task, s model.Spider, u go FinishOrCancelTask(ch, cmd, s, t) // kill的时候,可以kill所有的子进程 - if runtime.GOOS != constants.Windows { - cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - } + sys_exec.Setpgid(cmd) // 启动进程 if err := StartTaskProcess(cmd, t); err != nil {