Selenium ChromeDriver在AWS EKS异常,本地正常的问题求助
问题分析与解决方案
核心原因
user-data-dir唯一性不足:用int(time.time())作为后缀,高并发场景下同一秒可能生成重复目录名,导致目录占用冲突。- 进程回收不彻底:手动递归杀进程的方式可能遗漏Chrome子进程,或因权限/进程状态问题无法彻底终止,形成僵尸进程并持有目录锁。
- 容器资源限制:EKS Pod的CPU/内存配额不足,导致Chrome进程异常崩溃,进而无法正常清理目录和进程。
- 文件系统权限问题:在当前工作目录创建数据目录可能受挂载卷权限限制,且未及时清理旧目录,导致资源耗尽。
具体解决步骤
1. 确保user-data-dir绝对唯一且存储在临时目录
放弃时间戳,改用UUID生成唯一目录名,并将目录放在容器的/tmp(通常为tmpfs,容器重启后自动清理),避免挂载卷的权限问题:
import uuid import os # 生成唯一临时目录,放在/tmp下 self.tmp_dir = os.path.join("/tmp", f"chrome_data_{uuid.uuid4()}") os.makedirs(self.tmp_dir, exist_ok=True) # 配置Chrome选项 options.add_argument(f"user-data-dir={self.tmp_dir}")
2. 完善进程与资源清理逻辑
用try/finally确保driver.quit()必执行,结合psutil精准清理关联进程,并在清理后删除临时目录:
import psutil import shutil def cleanup(driver, tmp_dir): # 先尝试正常退出driver try: if driver: driver.quit() except Exception: pass # 清理关联的Chrome/Chromedriver进程(仅当前进程的子进程) current_pid = os.getpid() for proc in psutil.process_iter(['pid', 'name', 'ppid']): try: if proc.info['ppid'] == current_pid and proc.info['name'] in ['chrome', 'chromedriver', 'google-chrome']: proc.kill() proc.wait() # 等待进程彻底终止 except (psutil.NoSuchProcess, psutil.AccessDenied): pass # 删除临时目录 try: shutil.rmtree(tmp_dir) except Exception: pass # 使用示例:在处理URL的逻辑中 driver = None try: # 初始化driver和处理URL的逻辑 driver = webdriver.Chrome(options=options) # ... 处理URL ... finally: cleanup(driver, self.tmp_dir)
3. 复用WebDriver实例减少开销
避免为每个URL创建新的driver实例,改为复用一个driver处理多个URL,仅在全部任务完成后退出:
# 初始化一次driver driver = webdriver.Chrome(options=options) try: for url in url_list: driver.get(url) # ... 处理当前URL数据 ... finally: cleanup(driver, self.tmp_dir)
这种方式大幅减少进程创建/销毁次数,从根源降低目录冲突和僵尸进程的概率。
4. 调整EKS Pod资源配置
为Job的Pod设置足够的资源请求与限制,Chrome headless模式建议至少分配:
resources: requests: cpu: "1" memory: "1Gi" limits: cpu: "2" memory: "2Gi"
资源不足会导致Chrome进程频繁崩溃,进而引发进程和目录清理失败。
5. 验证Chrome与Chromedriver版本一致性
确保EKS容器中安装的Chrome和Chromedriver版本完全匹配(主版本号必须一致),版本不匹配会导致会话创建异常和进程管理混乱。
内容的提问来源于stack exchange,提问作者user30263759
相关产品推荐
相关产品推荐

