summaryrefslogtreecommitdiffhomepage
path: root/runsc
diff options
context:
space:
mode:
Diffstat (limited to 'runsc')
-rw-r--r--runsc/container/container_test.go2
-rw-r--r--runsc/sandbox/sandbox.go24
2 files changed, 21 insertions, 5 deletions
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
+ }
+ }
+ 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 true
+ return false
}
// killProcess sends a signal to the host process (i.e. a sandbox or gofer