From 4f68b251aca27352eb9d82e2769ad14d7339ef7c Mon Sep 17 00:00:00 2001 From: zhangyue Date: Tue, 25 Aug 2020 14:16:51 +0800 Subject: [PATCH] fix: fix script timeout can't work Signed-off-by: zhangyue --- pkg/custompluginmonitor/plugin/plugin.go | 27 +++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/pkg/custompluginmonitor/plugin/plugin.go b/pkg/custompluginmonitor/plugin/plugin.go index e5703a82..35cebcc9 100644 --- a/pkg/custompluginmonitor/plugin/plugin.go +++ b/pkg/custompluginmonitor/plugin/plugin.go @@ -148,7 +148,12 @@ func (p *Plugin) run(rule cpmtypes.CustomRule) (exitStatus cpmtypes.Status, outp } defer cancel() - cmd := exec.CommandContext(ctx, rule.Path, rule.Args...) + // create a process group + sysProcAttr := &syscall.SysProcAttr{ + Setpgid: true, + } + cmd := exec.Command(rule.Path, rule.Args...) + cmd.SysProcAttr = sysProcAttr stdoutPipe, err := cmd.StdoutPipe() if err != nil { @@ -165,6 +170,26 @@ func (p *Plugin) run(rule cpmtypes.CustomRule) (exitStatus cpmtypes.Status, outp return cpmtypes.Unknown, "Error in starting plugin. Please check the error log" } + waitChan := make(chan struct{}) + defer close(waitChan) + + go func() { + select { + case <-ctx.Done(): + glog.Errorf("Error in running plugin timeout %q", rule.Path) + if cmd.Process == nil || cmd.Process.Pid == 0 { + glog.Errorf("Error in cmd.Process check %q", rule.Path) + break + } + err := syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) + if err != nil { + glog.Errorf("Error in kill process %d, %v", cmd.Process.Pid, err) + } + case <-waitChan: + return + } + }() + var ( wg sync.WaitGroup stdout []byte