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 <cat@ophivana.moe>
This commit is contained in:
Ophestra Umiker 2024-10-17 02:38:24 +09:00
parent dd78728fb3
commit 5401882ed0
Signed by: cat
SSH Key Fingerprint: SHA256:gQ67O0enBZ7UdZypgtspB2FDM1g3GVw8nX0XSdcFw8Q
1 changed files with 15 additions and 0 deletions

View File

@ -11,10 +11,16 @@ import (
"path" "path"
"strconv" "strconv"
"syscall" "syscall"
"time"
"git.ophivana.moe/cat/fortify/internal/verbose" "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 // everything beyond this point runs within pid namespace
// proceed with caution! // proceed with caution!
@ -121,6 +127,8 @@ func doInit(fd uintptr) {
close(done) close(done)
}() }()
timeout := make(chan struct{})
r := 2 r := 2
for { for {
select { select {
@ -138,8 +146,15 @@ func doInit(fd uintptr) {
r = 255 r = 255
} }
} }
go func() {
time.Sleep(residualProcessTimeout)
close(timeout)
}()
case <-done: case <-done:
os.Exit(r) os.Exit(r)
case <-timeout:
fmt.Println("fortify-init: timeout exceeded waiting for lingering processes")
os.Exit(r)
} }
} }
} }