diff --git a/daemon/container.go b/daemon/container.go index 2ae263289d..20b86f7e20 100644 --- a/daemon/container.go +++ b/daemon/container.go @@ -584,6 +584,7 @@ func (container *Container) Stop(seconds int) error { log.Printf("Container %v failed to exit within %d seconds of SIGTERM - using the force", container.ID, seconds) // 3. If it doesn't, then send SIGKILL if err := container.Kill(); err != nil { + container.Wait() return err } } diff --git a/daemon/execdriver/lxc/driver.go b/daemon/execdriver/lxc/driver.go index 6b2b2cc46b..2e84fcc84d 100644 --- a/daemon/execdriver/lxc/driver.go +++ b/daemon/execdriver/lxc/driver.go @@ -181,6 +181,7 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba if err != nil { if c.Process != nil { c.Process.Kill() + c.Process.Wait() } return -1, err } diff --git a/pkg/libcontainer/nsinit/exec.go b/pkg/libcontainer/nsinit/exec.go index fbc7512047..3545278738 100644 --- a/pkg/libcontainer/nsinit/exec.go +++ b/pkg/libcontainer/nsinit/exec.go @@ -40,7 +40,9 @@ func Exec(container *libcontainer.Container, term Terminal, rootfs, dataPath str } command := createCommand(container, console, rootfs, dataPath, os.Args[0], syncPipe.child, args) + if err := term.Attach(command); err != nil { + command.Wait() return -1, err } defer term.Close() @@ -55,6 +57,7 @@ func Exec(container *libcontainer.Container, term Terminal, rootfs, dataPath str } if err := WritePid(dataPath, command.Process.Pid, started); err != nil { command.Process.Kill() + command.Process.Wait() return -1, err } defer DeletePid(dataPath) @@ -64,6 +67,7 @@ func Exec(container *libcontainer.Container, term Terminal, rootfs, dataPath str cleaner, err := SetupCgroups(container, command.Process.Pid) if err != nil { command.Process.Kill() + command.Process.Wait() return -1, err } if cleaner != nil { @@ -72,6 +76,7 @@ func Exec(container *libcontainer.Container, term Terminal, rootfs, dataPath str if err := InitializeNetworking(container, command.Process.Pid, syncPipe); err != nil { command.Process.Kill() + command.Process.Wait() return -1, err } diff --git a/pkg/libcontainer/nsinit/init.go b/pkg/libcontainer/nsinit/init.go index 3012106769..509f3a2796 100644 --- a/pkg/libcontainer/nsinit/init.go +++ b/pkg/libcontainer/nsinit/init.go @@ -126,7 +126,9 @@ func RestoreParentDeathSignal(old int) error { // Signal self if parent is already dead. Does nothing if running in a new // PID namespace, as Getppid will always return 0. if syscall.Getppid() == 1 { - return syscall.Kill(syscall.Getpid(), syscall.Signal(old)) + err := syscall.Kill(syscall.Getpid(), syscall.Signal(old)) + syscall.Wait4(syscall.Getpid(), nil, 0, nil) + return err } return nil