| ... | ... |
@@ -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 |
} |