package actuator /* @Time : 2021/10/21 上午10:49 @Author : Zhouyc */ import ( "bytes" "errors" "log" "os/exec" ) import "time" //import "errors" func launch(command string,timeout int)(string,error) { var shellErr=make(chan error) var done=make(chan string) cmd:=exec.Command("/usr/bin/bash",command) var stdout,stderr bytes.Buffer cmd.Stdout=&stdout cmd.Stderr=&stderr //launch go func() { err:=cmd.Run() if err!=nil{ shellErr <- err log.Printf("Unable to execute shells:%v",err) return } log.Printf("Shells ran successfully") done<-stdout.String()+stderr.String() }() // timeout==-1 means no need for timeout function if timeout!=-1 { select { case <-time.After(time.Second * time.Duration(timeout)): log.Printf("Shell scripts timeout") err := cmd.Process.Kill() if err!=nil{ return "",err } return "", errors.New("sh script timeout") case result := <-done: log.Printf("stdout&stderr:%s", result) return result, nil case err := <-shellErr: log.Printf("sh script error:%v", err) return "", err } } select { case result := <-done: log.Printf("stdout&stderr:%s", result) return result, nil case err := <-shellErr: log.Printf("error occured while launching:%v", err) return "shell running error", err } }