From a9c9f0272a0f0524e5d5979ada4dff4bff423f62 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Thu, 11 Dec 2025 17:00:22 +0800 Subject: [PATCH] fix: Fix cronjob manual stop not working (#11300) --- agent/utils/cmd/cmdx.go | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/agent/utils/cmd/cmdx.go b/agent/utils/cmd/cmdx.go index 5923280fa..8bd5e1081 100644 --- a/agent/utils/cmd/cmdx.go +++ b/agent/utils/cmd/cmdx.go @@ -108,12 +108,16 @@ func (c *CommandHelper) run(name string, arg ...string) (string, error) { cmd = exec.CommandContext(newContext, name, arg...) } else { if c.context == nil { + newContext = context.Background() cmd = exec.Command(name, arg...) } else { newContext = c.context cmd = exec.CommandContext(c.context, name, arg...) } } + cmd.SysProcAttr = &syscall.SysProcAttr{ + Setpgid: true, + } customWriter := &CustomWriter{taskItem: c.taskItem} var stdout, stderr bytes.Buffer @@ -145,22 +149,39 @@ func (c *CommandHelper) run(name string, arg ...string) (string, error) { cmd.Dir = c.workDir } - err := cmd.Run() + if err := cmd.Start(); err != nil { + return "", fmt.Errorf("cmd.Start() failed with '%s'\n", err) + } if c.taskItem != nil { customWriter.Flush() } - if c.timeout != 0 { - if newContext != nil && errors.Is(newContext.Err(), context.DeadlineExceeded) { - return "", buserr.New("ErrCmdTimeout") + + done := make(chan error, 1) + go func() { + done <- cmd.Wait() + }() + select { + case err := <-done: + if err != nil { + return handleErr(stdout, stderr, c.IgnoreExist1, err) } - } - if err != nil { - if err.Error() == "signal: killed" { - return "", buserr.New("ErrShutDown") + return stdout.String(), nil + case <-newContext.Done(): + if cmd.Process != nil && cmd.Process.Pid > 0 { + syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) } - return handleErr(stdout, stderr, c.IgnoreExist1, err) + var err error + switch newContext.Err() { + case context.DeadlineExceeded: + err = buserr.New("ErrCmdTimeout") + case context.Canceled: + err = buserr.New("ErrShutDown") + default: + err = newContext.Err() + } + <-done + return "", err } - return stdout.String(), nil } func WithContext(ctx context.Context) Option {