From 1cac70b22b5970a270853d3e545bc57a1ceb33a9 Mon Sep 17 00:00:00 2001 From: gemer Date: Wed, 16 Sep 2020 11:44:41 +0800 Subject: [PATCH 1/2] add backend install script execute privilege and fixed nodejs with unbunu deprecated libssl1.0-dev --- backend/scripts/install-nodejs.sh | 5 ++--- docker_init.sh | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/scripts/install-nodejs.sh b/backend/scripts/install-nodejs.sh index 802e001e..61b4d778 100644 --- a/backend/scripts/install-nodejs.sh +++ b/backend/scripts/install-nodejs.sh @@ -10,9 +10,8 @@ touch /tmp/install.lock touch /tmp/install-nodejs.lock # install node.js -curl -sL https://deb.nodesource.com/setup_10.x | bash - -apt-get update && apt install -y nodejs nodejs-dev node-gyp libssl1.0-dev -apt-get update && apt install -y npm +curl -sL https://deb.nodesource.com/setup_12.x | bash - +apt-get update && apt install -y nodejs # install chromium # See https://crbug.com/795759 diff --git a/docker_init.sh b/docker_init.sh index dfef4eaf..cd2fd811 100755 --- a/docker_init.sh +++ b/docker_init.sh @@ -22,6 +22,9 @@ fi # start nginx service nginx start +#grant script +chmod +x /app/backend/scripts/*.sh + # install languages if [ "${CRAWLAB_SERVER_LANG_NODE}" = "Y" ] || [ "${CRAWLAB_SERVER_LANG_JAVA}" = "Y" ] || [ "${CRAWLAB_SERVER_LANG_DOTNET}" = "Y" ] || [ "${CRAWLAB_SERVER_LANG_PHP}" = "Y" ] || [ "${CRAWLAB_SERVER_LANG_GO}" = "Y" ]; then From feda43650c92aea33118d8cf8e33e3fc13620a0e Mon Sep 17 00:00:00 2001 From: zkqiang Date: Sun, 20 Sep 2020 12:35:21 +0800 Subject: [PATCH 2/2] 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 {