1234567891011121314151617181920212223242526272829303132333435363738394041 |
- // +build !experimental
- package libcontainerd
- import (
- "syscall"
- "time"
- "github.com/Sirupsen/logrus"
- )
- func (clnt *client) Restore(containerID string, options ...CreateOption) error {
- w := clnt.getOrCreateExitNotifier(containerID)
- defer w.close()
- cont, err := clnt.getContainerdContainer(containerID)
- if err == nil && cont.Status != "stopped" {
- clnt.lock(cont.Id)
- container := clnt.newContainer(cont.BundlePath)
- container.systemPid = systemPid(cont)
- clnt.appendContainer(container)
- clnt.unlock(cont.Id)
- if err := clnt.Signal(containerID, int(syscall.SIGTERM)); err != nil {
- logrus.Errorf("error sending sigterm to %v: %v", containerID, err)
- }
- select {
- case <-time.After(10 * time.Second):
- if err := clnt.Signal(containerID, int(syscall.SIGKILL)); err != nil {
- logrus.Errorf("error sending sigkill to %v: %v", containerID, err)
- }
- select {
- case <-time.After(2 * time.Second):
- case <-w.wait():
- return nil
- }
- case <-w.wait():
- return nil
- }
- }
- return clnt.setExited(containerID)
- }
|