From 5cc016c8a21067245d8eb952ea327e883acedb07 Mon Sep 17 00:00:00 2001 From: ZeroMagic Date: Thu, 9 Aug 2018 10:32:25 +0800 Subject: [PATCH] containerd-shim-kata-v2: add the service Kill support Add the Kill api support to send signal to a given container process. Signed-off-by: ZeroMagic Signed-off-by: fupan.li --- containerd-shim-v2/service.go | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/containerd-shim-v2/service.go b/containerd-shim-v2/service.go index 3d2a292e6e..9f14efd460 100644 --- a/containerd-shim-v2/service.go +++ b/containerd-shim-v2/service.go @@ -547,7 +547,38 @@ func (s *service) Resume(ctx context.Context, r *taskAPI.ResumeRequest) (*ptypes // Kill a process with the provided signal func (s *service) Kill(ctx context.Context, r *taskAPI.KillRequest) (*ptypes.Empty, error) { - return nil, errdefs.ErrNotImplemented + s.Lock() + defer s.Unlock() + + signum := syscall.Signal(r.Signal) + + c, err := s.getContainer(r.ID) + if err != nil { + return nil, err + } + + processID := c.id + if r.ExecID != "" { + execs, err := c.getExec(r.ExecID) + if err != nil { + return nil, err + } + processID = execs.id + } + + err = s.sandbox.SignalProcess(c.id, processID, signum, r.All) + if err != nil { + return nil, err + } + + // Since the k8s will use the SIGTERM signal to stop a container by default, but + // some container processes would ignore this signal such as shell, thus it's better + // to resend another SIGKILL signal to make sure the container process terminated successfully. + if signum == syscall.SIGTERM { + err = s.sandbox.SignalProcess(c.id, processID, syscall.SIGKILL, r.All) + } + + return empty, err } // Pids returns all pids inside the container