Remove the ghosts and kill everything

Docker-DCO-1.1-Signed-off-by: Michael Crosby <michael@crosbymichael.com> (github: crosbymichael)
This commit is contained in:
Michael Crosby
2014-03-06 15:30:26 -08:00
parent b722aa21b7
commit 772ef99d28
7 changed files with 43 additions and 168 deletions
-1
View File
@@ -77,7 +77,6 @@ type TtyTerminal interface {
type Driver interface {
Run(c *Command, pipes *Pipes, startCallback StartCallback) (int, error) // Run executes the process and blocks until the process exits and returns the exit code
Kill(c *Command, sig int) error
Restore(c *Command) error // Wait and try to re-attach on an out of process command
Name() string // Driver name
Info(id string) Info // "temporary" hack (until we move state from core to plugins)
GetPidsForContainer(id string) ([]int, error) // Returns a list of pids for the given container.
+4 -17
View File
@@ -189,20 +189,7 @@ func getExitCode(c *execdriver.Command) int {
}
func (d *driver) Kill(c *execdriver.Command, sig int) error {
return d.kill(c, sig)
}
func (d *driver) Restore(c *execdriver.Command) error {
for {
output, err := exec.Command("lxc-info", "-n", c.ID).CombinedOutput()
if err != nil {
return err
}
if !strings.Contains(string(output), "RUNNING") {
return nil
}
time.Sleep(500 * time.Millisecond)
}
return KillLxc(c.ID, sig)
}
func (d *driver) version() string {
@@ -225,16 +212,16 @@ func (d *driver) version() string {
return version
}
func (d *driver) kill(c *execdriver.Command, sig int) error {
func KillLxc(id string, sig int) error {
var (
err error
output []byte
)
_, err = exec.LookPath("lxc-kill")
if err == nil {
output, err = exec.Command("lxc-kill", "-n", c.ID, strconv.Itoa(sig)).CombinedOutput()
output, err = exec.Command("lxc-kill", "-n", id, strconv.Itoa(sig)).CombinedOutput()
} else {
output, err = exec.Command("lxc-stop", "-k", "-n", c.ID, strconv.Itoa(sig)).CombinedOutput()
output, err = exec.Command("lxc-stop", "-k", "-n", id, strconv.Itoa(sig)).CombinedOutput()
}
if err != nil {
return fmt.Errorf("Err: %s Output: %s", err, output)
+3 -36
View File
@@ -16,7 +16,6 @@ import (
"strconv"
"strings"
"syscall"
"time"
)
const (
@@ -109,41 +108,9 @@ func (d *driver) Run(c *execdriver.Command, pipes *execdriver.Pipes, startCallba
}
func (d *driver) Kill(p *execdriver.Command, sig int) error {
return syscall.Kill(p.Process.Pid, syscall.Signal(sig))
}
func (d *driver) Restore(c *execdriver.Command) error {
var nspid int
f, err := os.Open(filepath.Join(d.root, c.ID, "pid"))
if err != nil {
return err
}
defer d.removeContainerRoot(c.ID)
if _, err := fmt.Fscanf(f, "%d", &nspid); err != nil {
f.Close()
return err
}
f.Close()
if _, err := os.FindProcess(nspid); err != nil {
return fmt.Errorf("finding existing pid %d %s", nspid, err)
}
c.Process = &os.Process{
Pid: nspid,
}
ticker := time.NewTicker(500 * time.Millisecond)
defer ticker.Stop()
for _ = range ticker.C {
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
err := syscall.Kill(p.Process.Pid, syscall.Signal(sig))
d.removeContainerRoot(p.ID)
return err
}
func (d *driver) Info(id string) execdriver.Info {