diff --git a/runsc/container/container_test.go b/runsc/container/container_test.go index 0844cb9df..3af8d620c 100644 --- a/runsc/container/container_test.go +++ b/runsc/container/container_test.go @@ -186,6 +186,8 @@ func TestLifecycle(t *testing.T) { // ourselves. p, _ := os.FindProcess(s.Sandbox.Pid) p.Wait() + g, _ := os.FindProcess(s.Sandbox.GoferPid) + g.Wait() // Load the container from disk and check the status. s, err = container.Load(rootDir, id) diff --git a/runsc/sandbox/sandbox.go b/runsc/sandbox/sandbox.go index 91c44c996..bfaead1f2 100644 --- a/runsc/sandbox/sandbox.go +++ b/runsc/sandbox/sandbox.go @@ -440,13 +440,27 @@ func (s *Sandbox) Signal(cid string, sig syscall.Signal) error { return nil } -// IsRunning returns true iff the sandbox process is running. +// IsRunning returns true if the sandbox or gofer process is running. func (s *Sandbox) IsRunning() bool { - // Send a signal 0 to the sandbox process. - if err := killProcess(s.Pid, 0); err != nil { - return false + if s.Pid != 0 { + // Send a signal 0 to the sandbox process. + if err := killProcess(s.Pid, 0); err == nil { + return true + } } - return true + if s.GoferPid != 0 { + // Send a signal 0 to the gofer process. + if err := killProcess(s.GoferPid, 0); err == nil { + log.Warningf("Found orphan gofer process, pid: %d", s.GoferPid) + // Attempt to kill gofer if it's orphan. + killProcess(s.GoferPid, unix.SIGKILL) + + // Don't wait for gofer to die. Return 'running' and hope gofer is dead + // next time around. + return true + } + } + return false } // killProcess sends a signal to the host process (i.e. a sandbox or gofer