mirror of
https://github.com/NanmiCoder/MediaCrawler.git
synced 2026-10-04 05:08:13 +08:00
Improve BrowserLauncher cleanup handling
This commit is contained in:
+44
-14
@@ -14,6 +14,7 @@ import platform
|
|||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
import socket
|
import socket
|
||||||
|
import signal
|
||||||
from typing import Optional, List, Tuple
|
from typing import Optional, List, Tuple
|
||||||
import asyncio
|
import asyncio
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -170,6 +171,7 @@ class BrowserLauncher:
|
|||||||
preexec_fn=os.setsid # 创建新的进程组
|
preexec_fn=os.setsid # 创建新的进程组
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.browser_process = process
|
||||||
return process
|
return process
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -230,20 +232,48 @@ class BrowserLauncher:
|
|||||||
"""
|
"""
|
||||||
清理资源,关闭浏览器进程
|
清理资源,关闭浏览器进程
|
||||||
"""
|
"""
|
||||||
if self.browser_process:
|
if not self.browser_process:
|
||||||
try:
|
return
|
||||||
utils.logger.info("[BrowserLauncher] 正在关闭浏览器进程...")
|
|
||||||
|
|
||||||
if self.system == "Windows":
|
process = self.browser_process
|
||||||
# Windows下使用taskkill强制终止进程树
|
|
||||||
subprocess.run(["taskkill", "/F", "/T", "/PID", str(self.browser_process.pid)],
|
if process.poll() is not None:
|
||||||
capture_output=True)
|
utils.logger.info("[BrowserLauncher] 浏览器进程已退出,无需清理")
|
||||||
|
self.browser_process = None
|
||||||
|
return
|
||||||
|
|
||||||
|
utils.logger.info("[BrowserLauncher] 正在关闭浏览器进程...")
|
||||||
|
|
||||||
|
try:
|
||||||
|
if self.system == "Windows":
|
||||||
|
# 先尝试正常终止
|
||||||
|
process.terminate()
|
||||||
|
try:
|
||||||
|
process.wait(timeout=5)
|
||||||
|
except subprocess.TimeoutExpired:
|
||||||
|
utils.logger.warning("[BrowserLauncher] 正常终止超时,使用taskkill强制结束")
|
||||||
|
subprocess.run(
|
||||||
|
["taskkill", "/F", "/T", "/PID", str(process.pid)],
|
||||||
|
capture_output=True,
|
||||||
|
check=False,
|
||||||
|
)
|
||||||
|
process.wait(timeout=5)
|
||||||
|
else:
|
||||||
|
pgid = os.getpgid(process.pid)
|
||||||
|
try:
|
||||||
|
os.killpg(pgid, signal.SIGTERM)
|
||||||
|
except ProcessLookupError:
|
||||||
|
utils.logger.info("[BrowserLauncher] 浏览器进程组不存在,可能已退出")
|
||||||
else:
|
else:
|
||||||
# Unix系统下终止进程组
|
try:
|
||||||
os.killpg(os.getpgid(self.browser_process.pid), 9)
|
process.wait(timeout=5)
|
||||||
|
except subprocess.TimeoutExpired:
|
||||||
|
utils.logger.warning("[BrowserLauncher] 优雅关闭超时,发送SIGKILL")
|
||||||
|
os.killpg(pgid, signal.SIGKILL)
|
||||||
|
process.wait(timeout=5)
|
||||||
|
|
||||||
self.browser_process = None
|
utils.logger.info("[BrowserLauncher] 浏览器进程已关闭")
|
||||||
utils.logger.info("[BrowserLauncher] 浏览器进程已关闭")
|
except Exception as e:
|
||||||
|
utils.logger.warning(f"[BrowserLauncher] 关闭浏览器进程时出错: {e}")
|
||||||
except Exception as e:
|
finally:
|
||||||
utils.logger.warning(f"[BrowserLauncher] 关闭浏览器进程时出错: {e}")
|
self.browser_process = None
|
||||||
|
|||||||
+21
-9
@@ -291,16 +291,28 @@ class CDPBrowserManager:
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
# 关闭浏览器上下文
|
# 关闭浏览器上下文
|
||||||
# if self.browser_context:
|
if self.browser_context:
|
||||||
# await self.browser_context.close()
|
try:
|
||||||
# self.browser_context = None
|
await self.browser_context.close()
|
||||||
# utils.logger.info("[CDPBrowserManager] 浏览器上下文已关闭")
|
utils.logger.info("[CDPBrowserManager] 浏览器上下文已关闭")
|
||||||
|
except Exception as context_error:
|
||||||
|
utils.logger.warning(
|
||||||
|
f"[CDPBrowserManager] 关闭浏览器上下文失败: {context_error}"
|
||||||
|
)
|
||||||
|
finally:
|
||||||
|
self.browser_context = None
|
||||||
|
|
||||||
# # 断开浏览器连接
|
# 断开浏览器连接
|
||||||
# if self.browser:
|
if self.browser:
|
||||||
# await self.browser.close()
|
try:
|
||||||
# self.browser = None
|
await self.browser.close()
|
||||||
# utils.logger.info("[CDPBrowserManager] 浏览器连接已断开")
|
utils.logger.info("[CDPBrowserManager] 浏览器连接已断开")
|
||||||
|
except Exception as browser_error:
|
||||||
|
utils.logger.warning(
|
||||||
|
f"[CDPBrowserManager] 关闭浏览器连接失败: {browser_error}"
|
||||||
|
)
|
||||||
|
finally:
|
||||||
|
self.browser = None
|
||||||
|
|
||||||
# 关闭浏览器进程(如果配置为自动关闭)
|
# 关闭浏览器进程(如果配置为自动关闭)
|
||||||
if config.AUTO_CLOSE_BROWSER:
|
if config.AUTO_CLOSE_BROWSER:
|
||||||
|
|||||||
Reference in New Issue
Block a user