You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu服务器Celery运行Selenium时DevToolsActivePort文件不存在错误

解决Celery终止Selenium任务后Chrome无法重启的问题

1. 清理Chrome临时残留文件

虽然ps -ef | grep chrome找不到进程,但Chrome的临时数据目录可能未被彻底清理,这会导致DevToolsActivePort文件残留。

  • 手动清理:执行命令删除/tmp下的Chrome临时目录:
    rm -rf /tmp/.org.chromium.Chromium.* /tmp/chrome_*
    
  • 代码中自动清理:在初始化Chrome前添加清理逻辑(Python示例):
    import shutil
    import os
    
    # 固定专属目录,每次启动前清空
    chrome_profile_dir = "/tmp/chrome_task_profile"
    if os.path.exists(chrome_profile_dir):
        shutil.rmtree(chrome_profile_dir)
    os.makedirs(chrome_profile_dir, exist_ok=True)
    
    chrome_options.add_argument(f'--user-data-dir={chrome_profile_dir}')
    

2. 指定固定调试端口与用户数据目录

给Chrome显式指定调试端口和专属数据目录,避免默认临时目录的残留问题:

chrome_options.add_argument('--remote-debugging-port=9222')  # 固定调试端口
chrome_options.add_argument('--user-data-dir=/tmp/chrome_fixed_profile')  # 固定数据目录

3. 确保Celery任务终止时正确关闭Chrome

手动终止任务时,Chrome进程可能未被正常关闭,需在任务中添加可靠的清理逻辑:

  • 使用try-finally保证driver.quit()执行:
    from celery import Celery
    from selenium import webdriver
    
    app = Celery('tasks', broker='redis://localhost:6379/0')
    
    @app.task
    def selenium_task():
        driver = None
        try:
            chrome_options = webdriver.ChromeOptions()
            chrome_options.add_argument('--headless')
            chrome_options.add_argument('--no-sandbox')
            chrome_options.add_argument('--disable-dev-shm-usage')
            driver = webdriver.Chrome(options=chrome_options)
            # 执行你的任务逻辑
        finally:
            if driver:
                driver.quit()  # 无论任务成功/失败/被终止,都关闭Chrome
    
  • 捕获Celery终止信号:注册信号处理函数,在收到SIGTERM/SIGINT时关闭Chrome:
    import signal
    
    def handle_termination(signum, frame):
        if 'driver' in locals() and driver is not None:
            driver.quit()
    
    signal.signal(signal.SIGTERM, handle_termination)
    signal.signal(signal.SIGINT, handle_termination)
    

4. 清理Chromedriver残留进程

有时Chrome主进程已退出,但Chromedriver进程可能残留,执行以下命令查找并杀死:

ps -ef | grep chromedriver | grep -v grep | awk '{print $2}' | xargs kill -9

或者结合Celery Worker的进程ID,清理其所有子进程:

# 先获取Celery Worker的PID
CELERY_WORKER_PID=$(ps -ef | grep celery | grep worker | grep -v grep | awk '{print $2}')
# 杀死该Worker的所有子进程
pstree -p $CELERY_WORKER_PID | grep -oP '\(\K\d+\)' | xargs kill -9

5. 调整系统资源限制

Ubuntu默认的资源限制可能导致问题,尝试:

  • 增大文件句柄限制:编辑/etc/security/limits.conf,添加:
    * soft nofile 65535
    * hard nofile 65535
    
    重启系统后生效,或临时生效:
    ulimit -n 65535
    
  • 扩容临时文件系统(若/tmp为tmpfs且空间不足):
    mount -o remount,size=4G /tmp
    

内容的提问来源于stack exchange,提问作者Ayush Sinha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:50:17