fix: reap leaders during group shutdown

This commit is contained in:
Dennis Juhler Aagaard
2026-09-24 17:40:13 +02:00
parent 75ff25d80b
commit 31aeeb5ed3
2 changed files with 93 additions and 2 deletions
@@ -211,6 +211,7 @@ class ProcessManager:
self._sleep = sleep
self._profile_path = profile_path
self._children: list[tuple[str, subprocess.Popen]] = []
self._reaped_children: set[int] = set()
self._groups: list[int] = []
self._dead_groups: set[int] = set()
self._stopping = False
@@ -255,7 +256,19 @@ class ProcessManager:
def _startup_stopping(self) -> bool:
return self._stopping or self._first_exited_child() is not None
def _reap_exited_children(self) -> None:
for _name, process in self._children:
if process.pid in self._reaped_children or process.poll() is None:
continue
try:
process.wait(timeout=None)
except OSError:
logging.error("Child process reap failed")
else:
self._reaped_children.add(process.pid)
def _live_groups(self) -> list[int]:
self._reap_exited_children()
live_groups = []
for pgid in self._groups:
if pgid in self._dead_groups:
@@ -291,10 +304,14 @@ class ProcessManager:
def _reap_all(self) -> None:
for _name, process in self._children:
if process.pid in self._reaped_children:
continue
try:
process.wait(timeout=None)
except OSError:
logging.error("Child process reap failed")
else:
self._reaped_children.add(process.pid)
def _shutdown(self) -> None:
if not self._children: