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

Ubuntu 20.04无GUI环境Selenium Geckodriver多次运行后报Connection refused错误

问题根因
  • 代码逻辑错误:driver初始化完成后再修改profile配置不会生效,还会导致临时配置文件无法正常清理,/tmp目录下残留大量rust_mozprofile开头的临时文件夹,占用系统资源
  • 进程未正常回收:脚本运行异常时driver.quit()没有被执行,后台残留大量僵尸Firefox、geckodriver进程,占满可用端口,新启动的服务无法绑定端口就会抛出Connection refused错误
  • 重复安装扩展:同时使用install_addon临时安装扩展和向profile写入扩展的逻辑,二者冲突导致Firefox退出时资源释放异常
修复方案

1. 修正代码逻辑

核心调整点:提前配置profile到driver初始化之前,新增try-finally块强制回收进程,去掉重复的扩展安装逻辑,修改后代码如下:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options as FirefoxOptions
from selenium.webdriver import FirefoxProfile
import time
import os

# 提前配置Firefox profile,初始化driver前完成所有参数设置
profile = FirefoxProfile()
extension_path = "/root/my_simple_extension.xpi"
profile.add_extension(extension_path)
profile.set_preference("security.fileuri.strict_origin_policy", False)
profile.update_preferences()

ff_options = FirefoxOptions()
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ff/85.0.4183.83 Safari/537.36"

ff_options.add_argument('-headless')
ff_options.add_argument(f'user-agent={user_agent}')
ff_options.add_argument('--disable-dev-shm-usage')
ff_options.add_argument('--no-sandbox')
ff_options.add_argument("--window-size=1920,1080")
ff_options.add_argument('--ignore-certificate-errors')
ff_options.add_argument('--allow-running-insecure-content')
ff_options.add_argument("--proxy-server='direct://'")
ff_options.add_argument("--proxy-bypass-list=*")
ff_options.add_argument("--start-maximized")
ff_options.add_argument('--disable-gpu')
ff_options.add_argument('--disable-setuid-sandbox')

driver = None
try:
    # 初始化driver时直接传入提前配置好的profile
    driver = webdriver.Firefox(
        executable_path='/usr/local/share/geckodriver', 
        options=ff_options,
        firefox_profile=profile
    )
    # 已经通过profile预装了扩展,无需重复调用install_addon
    driver.get("about:debugging#/runtime/this-firefox")
    time.sleep(1)
    parent1 = driver.find_element_by_xpath('(//div[@class="fieldpair"])[position()=3]')
    uuid = parent1.text.splitlines()[1]
    driver.get(f'moz-extension://{uuid}/home.html')
    time.sleep(1)
    print(driver.page_source)
finally:
    # 无论脚本是否异常,都强制回收资源
    if driver:
        try:
            driver.quit()
        except:
            pass
    # 兜底杀残留进程、清临时文件
    os.system("pkill -f firefox > /dev/null 2>&1")
    os.system("pkill -f geckodriver > /dev/null 2>&1")
    os.system("rm -rf /tmp/rust_mozprofile* > /dev/null 2>&1")

2. 环境优化配置

  • 确认geckodriver版本和当前安装的Firefox版本匹配,版本不兼容会大幅提升进程残留概率
  • 如需高频率运行脚本,可开启内核端口复用参数,执行命令:echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
  • 可添加定时任务,每小时清理一次/tmp下的临时Firefox配置文件和残留进程,避免资源耗尽

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:18:01