From 37c7734048cc1a3d5c32147b2c040ab7250f8554 Mon Sep 17 00:00:00 2001 From: kaiyou <dev@kaiyou.fr> Date: Thu, 19 Oct 2023 20:27:45 +0200 Subject: [PATCH] Reap zombie processes --- services/kubelet.go | 2 +- services/reaper.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 services/reaper.go diff --git a/services/kubelet.go b/services/kubelet.go index 6698c35..cf00b4f 100644 --- a/services/kubelet.go +++ b/services/kubelet.go @@ -38,7 +38,7 @@ import ( var kubeKubelet = &Unit{ Name: "kubelet", - Dependencies: []*Unit{masterDiscovery, containerdGRPC, containerdTTRPC, pkiCA, pkiNode, kubeLogger}, + Dependencies: []*Unit{masterDiscovery, containerdGRPC, containerdTTRPC, pkiCA, pkiNode, kubeLogger, reaper}, Run: func(u *Unit, c *Cluster, ctx context.Context) error { // Sleep before starting, to make sure that containerd is actually ready // (very difficult to check otherwise) diff --git a/services/reaper.go b/services/reaper.go new file mode 100644 index 0000000..184920a --- /dev/null +++ b/services/reaper.go @@ -0,0 +1,33 @@ +package services + +import ( + "context" + "os" + "os/signal" + "time" + + "golang.org/x/sys/unix" +) + +var reaper = &Unit{ + Name: "reaper", + Run: func(u *Unit, c *Cluster, ctx context.Context) error { + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, unix.SIGCHLD) + u.Markready() + for { + <-sigs + // Sleep before reaping, to avoid racing with native waitpid + // any delay will do, since we merely try to avoid accumulating defuncts + time.Sleep(60 * time.Second) + for { + var status unix.WaitStatus + _, err := unix.Wait4(-1, &status, unix.WNOHANG, nil) + if err != nil { + break + } + } + + } + }, +} -- GitLab