Celery+Selenium启动Chrome崩溃问题排查与修复求助
问题排查与修复方案
针对Celery批量启动Chrome实例运行2天后出现WebDriverException: unknown error: Chrome failed to start: crashed. (unknown error: DevToolsActivePort file doesn't exist)的问题,提供以下排查与修复方法:
一、原因排查方法
- 检查Chrome进程残留:执行
ps aux | grep chrome查看是否存在大量僵死的Chrome/chromedriver进程。即便Celery终止任务,也可能出现Selenium未彻底清理进程的情况,残留进程会占用端口或系统资源,导致新实例无法启动。 - 验证DevTools端口占用:使用
lsof -i :9222(默认DevTools端口)查看端口占用状态。若任务中指定了固定DevTools端口,端口被占会直接导致Chrome启动失败。 - 排查系统细项资源:
- 查看文件句柄限制:执行
ulimit -n,Chrome每个实例会占用多个文件句柄,长期运行可能耗尽上限。 - 检查磁盘空间:确认
/tmp目录是否已满,Chrome会在该目录存放临时文件,空间不足会引发启动崩溃。
- 查看文件句柄限制:执行
- 确认版本兼容性:检查Chrome浏览器与chromedriver版本是否严格匹配,版本不兼容可能导致长期运行中的偶发崩溃。
- 核对任务清理逻辑:检查Celery任务是否在结束时明确调用
driver.quit()(而非仅driver.close()),添加日志记录资源清理步骤,确认是否存在清理失败的任务。
二、修复方案
- 强制清理Chrome进程:在任务结束时,除正常退出Selenium,额外强制杀死关联进程,避免残留:
import os import signal from selenium import webdriver def celery_task(): driver = webdriver.Chrome() try: # 业务逻辑代码 pass finally: driver.quit() # 强制终止Chrome进程 chrome_pid = driver.service.process.pid os.kill(chrome_pid, signal.SIGTERM) - 优化Chrome启动参数:添加避免冲突和资源占用的参数:
options = webdriver.ChromeOptions() options.add_argument('--headless=new') # 无头模式降低资源消耗 options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') # 规避/dev/shm空间不足问题 options.add_argument('--remote-debugging-port=0') # 随机分配端口,避免冲突 options.add_argument(f'--user-data-dir=/tmp/chrome-profiles/{os.getpid()}') # 每个任务独立缓存目录 driver = webdriver.Chrome(options=options) - 调整Celery配置:限制并发数与worker生命周期,避免资源泄漏:
CELERYD_MAX_TASKS_PER_CHILD = 10 # 每个worker处理10个任务后重启 CELERYD_CONCURRENCY = 8 # 根据服务器配置调整并发数,避免过载 - 提升系统资源限制:
- 修改
/etc/security/limits.conf,添加:
重启系统后生效,提升文件句柄上限。* soft nofile 65535 * hard nofile 65535 - 设置Cron定时任务,定期清理
/tmp下的Chrome临时文件,避免磁盘空间耗尽。
- 修改
- 同步Chrome与chromedriver版本:确保两者版本完全匹配,若当前版本存在长期运行bug,尝试升级至稳定版或回退至无问题的历史版本。
内容的提问来源于stack exchange,提问作者mascai
相关产品推荐
相关产品推荐

