feat: manage task process lifetimes and preserve turn history

This commit is contained in:
Ed1s0nZ
2026-09-16 17:52:58 +08:00
parent fd1c13a43d
commit f7882be546
54 changed files with 3650 additions and 330 deletions
+52
View File
@@ -0,0 +1,52 @@
package processguard
import (
"context"
"crypto/rand"
"errors"
"fmt"
"os"
"os/exec"
)
// Check exercises the real creation path, including clone3/Job inheritance,
// watchdog readiness, admission and cleanup. It does not start the HTTP server.
func Check(ctx context.Context) (backend string, err error) {
var id [16]byte
if _, err = rand.Read(id[:]); err != nil {
return "", err
}
name := fmt.Sprintf("%x-%x-%x-%x-%x", id[:4], id[4:6], id[6:8], id[8:10], id[10:])
g, err := New(name)
if err != nil {
return "", err
}
defer func() { err = errors.Join(err, g.Close(ctx)) }()
exe, err := os.Executable()
if err != nil {
return "", err
}
cmd := exec.CommandContext(ctx, exe, "-h")
configureGuardian(cmd)
launch, err := g.Prepare(cmd)
if err != nil {
return "", err
}
defer launch.Dispose()
if err = cmd.Start(); err != nil {
return "", err
}
if err = launch.Commit(); err != nil {
_ = cmd.Process.Kill()
_ = cmd.Wait()
return "", err
}
err = cmd.Wait()
if err != nil {
return "", err
}
if err = g.Release(cmd.Process.Pid); err != nil {
return "", err
}
return g.Name(), nil
}