diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2019-03-18 10:52:18 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2019-03-18 10:52:18 +0100 |
| commit | bdb7b93f25823c4a76d03592ab4c2baa7c30a1b9 (patch) | |
| tree | 07e26f0e729f32d075148bed0e664b6bcf758af1 /pkg/osutil/osutil.go | |
| parent | 08db11409e951dec09f7320771d95167e05b06d3 (diff) | |
pkg/osutil: kill subprocesses more reliably
In some cases we start scp, which starts ssh,
then kill scp but the ssh subprocess is not killed.
As the result cmd.Wait hangs waiting for EOF on the stdout/stderr,
which are still kept alive by ssh subprocess. But ssh just hangs forever.
Create a process group for each command and kill whole process group.
Hopefully this will help.
Diffstat (limited to 'pkg/osutil/osutil.go')
| -rw-r--r-- | pkg/osutil/osutil.go | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/pkg/osutil/osutil.go b/pkg/osutil/osutil.go index 7061b02d5..32a8054e7 100644 --- a/pkg/osutil/osutil.go +++ b/pkg/osutil/osutil.go @@ -36,6 +36,7 @@ func Run(timeout time.Duration, cmd *exec.Cmd) ([]byte, error) { if cmd.Stderr == nil { cmd.Stderr = output } + setPdeathsig(cmd) if err := cmd.Start(); err != nil { return nil, fmt.Errorf("failed to start %v %+v: %v", cmd.Path, cmd.Args, err) } @@ -46,6 +47,7 @@ func Run(timeout time.Duration, cmd *exec.Cmd) ([]byte, error) { select { case <-timer.C: timedout <- true + killPgroup(cmd) cmd.Process.Kill() case <-done: timedout <- false |
