From f009c4387865a584a15a0c6d83dd95b007ee41e5 Mon Sep 17 00:00:00 2001 From: eshun <78552423@qq.com> Date: Fri, 18 Feb 2022 15:55:00 +0800 Subject: [PATCH] add windows support (#867) * add windows support * add windows support * add windows support Co-authored-by: 78552423@qq.com --- src/pkg/sys/cmd_unix.go | 33 +++++++++++++++++++++++++++++++++ src/pkg/sys/cmd_windows.go | 30 ++++++++++++++++++++++++++++++ src/server/engine/notify.go | 2 +- 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/pkg/sys/cmd_unix.go create mode 100644 src/pkg/sys/cmd_windows.go diff --git a/src/pkg/sys/cmd_unix.go b/src/pkg/sys/cmd_unix.go new file mode 100644 index 00000000..618e5141 --- /dev/null +++ b/src/pkg/sys/cmd_unix.go @@ -0,0 +1,33 @@ +// +build aix darwin dragonfly freebsd js,wasm linux netbsd openbsd solaris plan9 + +// Unix environment variables. + +package sys + +import ( + "os/exec" + "syscall" + "time" +) + +func WrapTimeout(cmd *exec.Cmd, timeout time.Duration) (error, bool) { + var err error + + done := make(chan error) + go func() { + done <- cmd.Wait() + }() + + select { + case <-time.After(timeout): + go func() { + <-done // allow goroutine to exit + }() + + // IMPORTANT: cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} is necessary before cmd.Start() + err = syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) + return err, true + case err = <-done: + return err, false + } +} diff --git a/src/pkg/sys/cmd_windows.go b/src/pkg/sys/cmd_windows.go new file mode 100644 index 00000000..09278176 --- /dev/null +++ b/src/pkg/sys/cmd_windows.go @@ -0,0 +1,30 @@ +// Windows environment variables. + +package sys + +import ( + "os/exec" + "syscall" + "time" +) + +func WrapTimeout(cmd *exec.Cmd, timeout time.Duration) (error, bool) { + var err error + + done := make(chan error) + go func() { + done <- cmd.Wait() + }() + + select { + case <-time.After(timeout): + go func() { + <-done // allow goroutine to exit + }() + + err = cmd.Process.Signal(syscall.SIGKILL) + return err, true + case err = <-done: + return err, false + } +} diff --git a/src/server/engine/notify.go b/src/server/engine/notify.go index 61bc4bc6..aef99c32 100644 --- a/src/server/engine/notify.go +++ b/src/server/engine/notify.go @@ -16,9 +16,9 @@ import ( "github.com/toolkits/pkg/file" "github.com/toolkits/pkg/logger" "github.com/toolkits/pkg/runner" - "github.com/toolkits/pkg/sys" "github.com/didi/nightingale/v5/src/models" + "github.com/didi/nightingale/v5/src/pkg/sys" "github.com/didi/nightingale/v5/src/server/config" "github.com/didi/nightingale/v5/src/server/memsto" "github.com/didi/nightingale/v5/src/storage" -- GitLab