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