diff --git a/src/pkg/sys/cmd_unix.go b/src/pkg/sys/cmd_unix.go new file mode 100644 index 0000000000000000000000000000000000000000..618e514150cb48b5e197de6a1f31079c11b36257 --- /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 0000000000000000000000000000000000000000..092781767c1ff6b2df3c1498ce95f59f45b20f9e --- /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 61bc4bc68e22202f5b5dd51dcf696dec39357d1a..aef99c32a58f52fb1181fad43a7b786544ea01e4 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"