From dbcc7cb539274061fde3c775413a70be59f70b2c Mon Sep 17 00:00:00 2001 From: Eric Yang Date: Sun, 22 Mar 2026 19:21:28 +0000 Subject: [PATCH] refactor(shell): use finally block to reap zombie processes on timeout --- nanobot/agent/tools/shell.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/nanobot/agent/tools/shell.py b/nanobot/agent/tools/shell.py index 9996684..a69182f 100644 --- a/nanobot/agent/tools/shell.py +++ b/nanobot/agent/tools/shell.py @@ -6,6 +6,8 @@ import re from pathlib import Path from typing import Any +from loguru import logger + from nanobot.agent.tools.base import Tool @@ -109,12 +111,12 @@ class ExecTool(Tool): try: await asyncio.wait_for(process.wait(), timeout=5.0) except asyncio.TimeoutError: + pass + finally: try: os.waitpid(process.pid, os.WNOHANG) except (ProcessLookupError, ChildProcessError): pass - except ProcessLookupError: - pass return f"Error: Command timed out after {effective_timeout} seconds" output_parts = []