fix: reap zombie subprocesses in web_server action status and meet_bot cleanup

- web_server.py: after proc.poll() returns a non-None exit code, call
  proc.wait() to reap the child and move the entry from _ACTION_PROCS
  to _ACTION_RESULTS. Previously .poll() alone left <defunct> zombies.
- meet_bot.py: terminate and wait on the pcm_pump subprocess (paplay/
  ffmpeg) during the finally-block teardown. Previously leaked on every
  normal bot exit.
- tests: add test_action_status_reaps_completed_process and
  test_action_status_ignores_wait_failure covering both the happy path
  and the wait()-raises-OSError edge case.

Closes #38032
This commit is contained in:
islam666
2026-06-07 21:50:57 -07:00
committed by Teknium
parent e53b74c394
commit 78e2101cd2
3 changed files with 77 additions and 1 deletions
+7
View File
@@ -1691,6 +1691,13 @@ async def get_action_status(name: str, lines: int = 200):
exit_code = proc.poll()
running = exit_code is None
pid = proc.pid
if exit_code is not None:
try:
proc.wait(timeout=1)
except Exception:
pass
_ACTION_RESULTS[name] = {"exit_code": exit_code, "pid": pid}
_ACTION_PROCS.pop(name, None)
return {
"name": name,