fix timeout not working on linux/mac
This commit is contained in:
parent
830f418888
commit
6c1fa2f061
@ -254,7 +254,7 @@ type CmdOptions struct {
|
|||||||
func (a *Agent) NewCMDOpts() *CmdOptions {
|
func (a *Agent) NewCMDOpts() *CmdOptions {
|
||||||
return &CmdOptions{
|
return &CmdOptions{
|
||||||
Shell: "/bin/bash",
|
Shell: "/bin/bash",
|
||||||
Timeout: 30,
|
Timeout: 60,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,38 +322,46 @@ func (a *Agent) CmdV2(c *CmdOptions) CmdStatus {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
statusChan := make(chan gocmd.Status, 1)
|
||||||
// workaround for https://github.com/golang/go/issues/22315
|
// workaround for https://github.com/golang/go/issues/22315
|
||||||
for i := 0; i < 5; i++ {
|
|
||||||
<-envCmd.Start()
|
|
||||||
|
|
||||||
<-doneChan
|
|
||||||
|
|
||||||
status := envCmd.Status()
|
|
||||||
|
|
||||||
if errors.Is(status.Error, syscall.ETXTBSY) {
|
|
||||||
a.Logger.Errorln("CmdV2 syscall.ETXTBSY, retrying...")
|
|
||||||
time.Sleep(500 * time.Millisecond)
|
|
||||||
} else {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
select {
|
for i := 0; i < 5; i++ {
|
||||||
case <-doneChan:
|
finalStatus := <-envCmd.Start()
|
||||||
|
if errors.Is(finalStatus.Error, syscall.ETXTBSY) {
|
||||||
|
a.Logger.Errorln("CmdV2 syscall.ETXTBSY, retrying...")
|
||||||
|
time.Sleep(500 * time.Millisecond)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
statusChan <- finalStatus
|
||||||
return
|
return
|
||||||
case <-ctx.Done():
|
|
||||||
a.Logger.Debugf("Command timed out after %d seconds\n", c.Timeout)
|
|
||||||
pid := envCmd.Status().PID
|
|
||||||
a.Logger.Debugln("Killing process with PID", pid)
|
|
||||||
KillProc(int32(pid))
|
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
var finalStatus gocmd.Status
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
a.Logger.Debugf("Command timed out after %d seconds\n", c.Timeout)
|
||||||
|
pid := envCmd.Status().PID
|
||||||
|
a.Logger.Debugln("Killing process with PID", pid)
|
||||||
|
KillProc(int32(pid))
|
||||||
|
finalStatus.Exit = 98
|
||||||
|
ret := CmdStatus{
|
||||||
|
Status: finalStatus,
|
||||||
|
Stdout: CleanString(stdoutBuf.String()),
|
||||||
|
Stderr: fmt.Sprintf("%s\nTimed out after %d seconds", CleanString(stderrBuf.String()), c.Timeout),
|
||||||
|
}
|
||||||
|
a.Logger.Debugf("%+v\n", ret)
|
||||||
|
return ret
|
||||||
|
case finalStatus = <-statusChan:
|
||||||
|
// done
|
||||||
|
}
|
||||||
|
|
||||||
// Wait for goroutine to print everything
|
// Wait for goroutine to print everything
|
||||||
<-doneChan
|
<-doneChan
|
||||||
|
|
||||||
ret := CmdStatus{
|
ret := CmdStatus{
|
||||||
Status: envCmd.Status(),
|
Status: finalStatus,
|
||||||
Stdout: CleanString(stdoutBuf.String()),
|
Stdout: CleanString(stdoutBuf.String()),
|
||||||
Stderr: CleanString(stderrBuf.String()),
|
Stderr: CleanString(stderrBuf.String()),
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user