Fix daemon file descriptor handling

- Fixed ValueError with closed file when daemonizing
- Properly handle file descriptors with dup2
- Move signal handlers inside async context

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Claude4Ξlope 2025-06-27 18:07:15 +02:00
parent 6823d41dd1
commit 5b8bce926e
1 changed files with 20 additions and 13 deletions

View File

@ -35,6 +35,16 @@ async def run_daemon(args):
# Create and run daemon # Create and run daemon
daemon = MCPBrowserDaemon(browser, socket_path) daemon = MCPBrowserDaemon(browser, socket_path)
# Set up signal handlers
loop = asyncio.get_event_loop()
def signal_handler(signum):
logger.info(f"Received signal {signum}")
asyncio.create_task(daemon.stop())
for sig in (signal.SIGTERM, signal.SIGINT):
loop.add_signal_handler(sig, signal_handler, sig)
logger.info(f"Starting MCP Browser daemon on {socket_path}") logger.info(f"Starting MCP Browser daemon on {socket_path}")
try: try:
@ -118,20 +128,17 @@ def main():
os.setsid() os.setsid()
# Redirect stdin/stdout/stderr # Redirect stdin/stdout/stderr
with open(os.devnull, 'r') as devnull: devnull_in = open(os.devnull, 'r')
os.dup2(devnull.fileno(), sys.stdin.fileno()) devnull_out = open(os.devnull, 'w')
with open(os.devnull, 'w') as devnull:
os.dup2(devnull.fileno(), sys.stdout.fileno()) os.dup2(devnull_in.fileno(), sys.stdin.fileno())
os.dup2(devnull_out.fileno(), sys.stdout.fileno())
if not args.log_file: if not args.log_file:
os.dup2(devnull.fileno(), sys.stderr.fileno()) os.dup2(devnull_out.fileno(), sys.stderr.fileno())
# Set up signal handlers # Close the original file handles after dup2
def signal_handler(signum, frame): devnull_in.close()
logger.info(f"Received signal {signum}") devnull_out.close()
asyncio.create_task(daemon.stop())
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGINT, signal_handler)
# Run the daemon # Run the daemon
asyncio.run(run_daemon(args)) asyncio.run(run_daemon(args))