|
@@ -188,6 +188,34 @@ func notifyOnOOM(container libcontainer.Container) <-chan struct{} {
|
|
return oom
|
|
return oom
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func killCgroupProcs(c libcontainer.Container) {
|
|
|
|
+ var procs []*os.Process
|
|
|
|
+ if err := c.Pause(); err != nil {
|
|
|
|
+ logrus.Warn(err)
|
|
|
|
+ }
|
|
|
|
+ pids, err := c.Processes()
|
|
|
|
+ if err != nil {
|
|
|
|
+ // don't care about childs if we can't get them, this is mostly because cgroup already deleted
|
|
|
|
+ logrus.Warnf("Failed to get processes from container %s: %v", c.ID(), err)
|
|
|
|
+ }
|
|
|
|
+ for _, pid := range pids {
|
|
|
|
+ if p, err := os.FindProcess(pid); err == nil {
|
|
|
|
+ procs = append(procs, p)
|
|
|
|
+ if err := p.Kill(); err != nil {
|
|
|
|
+ logrus.Warn(err)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if err := c.Resume(); err != nil {
|
|
|
|
+ logrus.Warn(err)
|
|
|
|
+ }
|
|
|
|
+ for _, p := range procs {
|
|
|
|
+ if _, err := p.Wait(); err != nil {
|
|
|
|
+ logrus.Warn(err)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
func waitInPIDHost(p *libcontainer.Process, c libcontainer.Container) func() (*os.ProcessState, error) {
|
|
func waitInPIDHost(p *libcontainer.Process, c libcontainer.Container) func() (*os.ProcessState, error) {
|
|
return func() (*os.ProcessState, error) {
|
|
return func() (*os.ProcessState, error) {
|
|
pid, err := p.Pid()
|
|
pid, err := p.Pid()
|
|
@@ -195,8 +223,6 @@ func waitInPIDHost(p *libcontainer.Process, c libcontainer.Container) func() (*o
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
|
|
- processes, err := c.Processes()
|
|
|
|
-
|
|
|
|
process, err := os.FindProcess(pid)
|
|
process, err := os.FindProcess(pid)
|
|
s, err := process.Wait()
|
|
s, err := process.Wait()
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -206,19 +232,7 @@ func waitInPIDHost(p *libcontainer.Process, c libcontainer.Container) func() (*o
|
|
}
|
|
}
|
|
s = execErr.ProcessState
|
|
s = execErr.ProcessState
|
|
}
|
|
}
|
|
- if err != nil {
|
|
|
|
- return s, err
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for _, pid := range processes {
|
|
|
|
- process, err := os.FindProcess(pid)
|
|
|
|
- if err != nil {
|
|
|
|
- logrus.Errorf("Failed to kill process: %d", pid)
|
|
|
|
- continue
|
|
|
|
- }
|
|
|
|
- process.Kill()
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ killCgroupProcs(c)
|
|
p.Wait()
|
|
p.Wait()
|
|
return s, err
|
|
return s, err
|
|
}
|
|
}
|