diff --git a/daemon/container.go b/daemon/container.go index c1c215ffee..90cd3d8327 100644 --- a/daemon/container.go +++ b/daemon/container.go @@ -652,6 +652,16 @@ func (container *Container) KillSig(sig int) error { return container.daemon.Kill(container, sig) } +// Wrapper aroung KillSig() suppressing "no such process" error. +func (container *Container) killPossiblyDeadProcess(sig int) error { + err := container.KillSig(sig) + if err == syscall.ESRCH { + log.Debugf("Cannot kill process (pid=%d) with signal %d: no such process.", container.GetPid(), sig) + return nil + } + return err +} + func (container *Container) Pause() error { if container.IsPaused() { return fmt.Errorf("Container %s is already paused", container.ID) @@ -678,7 +688,7 @@ func (container *Container) Kill() error { } // 1. Send SIGKILL - if err := container.KillSig(9); err != nil { + if err := container.killPossiblyDeadProcess(9); err != nil { return err } @@ -688,7 +698,10 @@ func (container *Container) Kill() error { if pid := container.GetPid(); pid != 0 { log.Infof("Container %s failed to exit within 10 seconds of kill - trying direct SIGKILL", utils.TruncateID(container.ID)) if err := syscall.Kill(pid, 9); err != nil { - return err + if err != syscall.ESRCH { + return err + } + log.Debugf("Cannot kill process (pid=%d) with signal 9: no such process.", pid) } } } @@ -703,9 +716,9 @@ func (container *Container) Stop(seconds int) error { } // 1. Send a SIGTERM - if err := container.KillSig(15); err != nil { + if err := container.killPossiblyDeadProcess(15); err != nil { log.Infof("Failed to send SIGTERM to the process, force killing") - if err := container.KillSig(9); err != nil { + if err := container.killPossiblyDeadProcess(9); err != nil { return err } }