From 5401882ed0f4e6ca28d1312bc29b90bb4d64a04f Mon Sep 17 00:00:00 2001 From: Ophestra Umiker Date: Thu, 17 Oct 2024 02:38:24 +0900 Subject: [PATCH] init: post initial process death exit timeout Wait for 5 seconds before printing a message and exiting after picking up the initial process's wait status. This also kills any lingering processes.This behaviour is helpful for applications launched without a terminal attached. Signed-off-by: Ophestra Umiker --- internal/init/main.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/internal/init/main.go b/internal/init/main.go index 074b505..e79618b 100644 --- a/internal/init/main.go +++ b/internal/init/main.go @@ -11,10 +11,16 @@ import ( "path" "strconv" "syscall" + "time" "git.ophivana.moe/cat/fortify/internal/verbose" ) +const ( + // time to wait for linger processes after death initial process + residualProcessTimeout = 5 * time.Second +) + // everything beyond this point runs within pid namespace // proceed with caution! @@ -121,6 +127,8 @@ func doInit(fd uintptr) { close(done) }() + timeout := make(chan struct{}) + r := 2 for { select { @@ -138,8 +146,15 @@ func doInit(fd uintptr) { r = 255 } } + go func() { + time.Sleep(residualProcessTimeout) + close(timeout) + }() case <-done: os.Exit(r) + case <-timeout: + fmt.Println("fortify-init: timeout exceeded waiting for lingering processes") + os.Exit(r) } } }