diff --git a/container.go b/container.go index f180c7559b..eefbbe5c74 100644 --- a/container.go +++ b/container.go @@ -561,6 +561,12 @@ func (container *Container) kill() error { func (container *Container) Kill() error { container.State.lock() defer container.State.unlock() + if !container.State.Running { + return nil + } + if container.State.Ghost { + return fmt.Errorf("Impossible to kill ghost containers") + } return container.kill() } @@ -570,6 +576,9 @@ func (container *Container) Stop() error { if !container.State.Running { return nil } + if container.State.Ghost { + return fmt.Errorf("Impossible to stop ghost containers") + } // 1. Send a SIGTERM if output, err := exec.Command("lxc-kill", "-n", container.Id, "15").CombinedOutput(); err != nil { diff --git a/runtime.go b/runtime.go index 24194f74ad..ec02939702 100644 --- a/runtime.go +++ b/runtime.go @@ -119,6 +119,9 @@ func (runtime *Runtime) Load(id string) (*Container, error) { if container.Id != id { return container, fmt.Errorf("Container %s is stored at %s", container.Id, id) } + if container.State.Running { + container.State.Ghost = true + } if err := runtime.Register(container); err != nil { return nil, err } diff --git a/state.go b/state.go index 2ca7130921..f09b289a6a 100644 --- a/state.go +++ b/state.go @@ -12,11 +12,15 @@ type State struct { ExitCode int StartedAt time.Time l *sync.Mutex + Ghost bool } // String returns a human-readable description of the state func (s *State) String() string { if s.Running { + if s.Ghost { + return fmt.Sprintf("Running ghost") + } return fmt.Sprintf("Up %s", HumanDuration(time.Now().Sub(s.StartedAt))) } return fmt.Sprintf("Exit %d", s.ExitCode)