Browse code

Allow child process to live if daemon dies Docker-DCO-1.1-Signed-off-by: Michael Crosby <michael@crosbymichael.com> (github: crosbymichael)

Michael Crosby authored on 2014/02/28 02:28:26
Showing 2 changed files
... ...
@@ -15,6 +15,7 @@ import (
15 15
 	"strconv"
16 16
 	"strings"
17 17
 	"syscall"
18
+	"time"
18 19
 )
19 20
 
20 21
 const (
... ...
@@ -121,12 +122,22 @@ func (d *driver) Restore(c *execdriver.Command) error {
121 121
 	}
122 122
 	f.Close()
123 123
 
124
-	proc, err := os.FindProcess(nspid)
125
-	if err != nil {
126
-		return err
124
+	if _, err := os.FindProcess(nspid); err != nil {
125
+		return fmt.Errorf("finding existing pid %d %s", nspid, err)
127 126
 	}
128
-	_, err = proc.Wait()
129
-	return err
127
+	c.Process = &os.Process{
128
+		Pid: nspid,
129
+	}
130
+
131
+	for _ = range time.Tick(500 * time.Millisecond) {
132
+		if err := syscall.Kill(nspid, 0); err != nil {
133
+			if strings.Contains(err.Error(), "no such process") {
134
+				return nil
135
+			}
136
+			return fmt.Errorf("signal error %s", err)
137
+		}
138
+	}
139
+	return nil
130 140
 }
131 141
 
132 142
 func (d *driver) Info(id string) execdriver.Info {
... ...
@@ -50,9 +50,11 @@ func (ns *linuxNs) Init(container *libcontainer.Container, uncleanRootfs, consol
50 50
 		}
51 51
 	}
52 52
 
53
-	if err := system.ParentDeathSignal(); err != nil {
54
-		return fmt.Errorf("parent deth signal %s", err)
55
-	}
53
+	/*
54
+		if err := system.ParentDeathSignal(); err != nil {
55
+			return fmt.Errorf("parent death signal %s", err)
56
+		}
57
+	*/
56 58
 	if err := setupNewMountNamespace(rootfs, console, container.ReadonlyFs); err != nil {
57 59
 		return fmt.Errorf("setup mount namespace %s", err)
58 60
 	}