From fdeea90fc806d8d2cccdc76a6ecb214dd03093ec Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Thu, 27 Feb 2014 09:28:26 -0800 Subject: [PATCH] Allow child process to live if daemon dies Docker-DCO-1.1-Signed-off-by: Michael Crosby (github: crosbymichael) --- execdriver/native/driver.go | 21 ++++++++++++++++----- pkg/libcontainer/nsinit/init.go | 8 +++++--- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/execdriver/native/driver.go b/execdriver/native/driver.go index f2d7ed8ae2..ff96510262 100644 --- a/execdriver/native/driver.go +++ b/execdriver/native/driver.go @@ -15,6 +15,7 @@ import ( "strconv" "strings" "syscall" + "time" ) const ( @@ -121,12 +122,22 @@ func (d *driver) Restore(c *execdriver.Command) error { } f.Close() - proc, err := os.FindProcess(nspid) - if err != nil { - return err + if _, err := os.FindProcess(nspid); err != nil { + return fmt.Errorf("finding existing pid %d %s", nspid, err) } - _, err = proc.Wait() - return err + c.Process = &os.Process{ + Pid: nspid, + } + + for _ = range time.Tick(500 * time.Millisecond) { + if err := syscall.Kill(nspid, 0); err != nil { + if strings.Contains(err.Error(), "no such process") { + return nil + } + return fmt.Errorf("signal error %s", err) + } + } + return nil } func (d *driver) Info(id string) execdriver.Info { diff --git a/pkg/libcontainer/nsinit/init.go b/pkg/libcontainer/nsinit/init.go index cfc5058559..cc481e2cc8 100644 --- a/pkg/libcontainer/nsinit/init.go +++ b/pkg/libcontainer/nsinit/init.go @@ -50,9 +50,11 @@ func (ns *linuxNs) Init(container *libcontainer.Container, uncleanRootfs, consol } } - if err := system.ParentDeathSignal(); err != nil { - return fmt.Errorf("parent deth signal %s", err) - } + /* + if err := system.ParentDeathSignal(); err != nil { + return fmt.Errorf("parent death signal %s", err) + } + */ if err := setupNewMountNamespace(rootfs, console, container.ReadonlyFs); err != nil { return fmt.Errorf("setup mount namespace %s", err) }