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

Ubuntu多用户运行Selenium无头Chrome报DevToolsActivePort不存在

问题背景

Ubuntu服务器部署Python+Selenium脚本,以headless模式启动Chrome访问指定URL,服务器存在user1、user2两个普通系统用户,root账号可正常使用。
预期执行流程:

  • 分别开启两个终端会话登录user1、user2
  • 先在user1账号下启动脚本,等待执行完毕
  • 再切换到user2账号下启动同一段脚本
    实际异常表现:
  • 服务器重启后,第一个执行脚本的普通用户可正常运行,后续切换到其他普通用户执行脚本时抛出错误:DevToolsActivePort file doesn't exist
  • 报错后必须重启服务器才能让其他普通用户正常执行脚本,但重启后之前可正常运行的用户再次执行又会触发相同报错
  • root账号执行脚本无上述限制,无需重启即可随时正常运行
    原脚本代码如下:
import sys
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

def getChromeDriver():
    options = Options()
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")
    options.add_argument("--headless")
    options.add_argument("start-maximized")
    options.add_argument("window-size=1900,1080")
    s = Service("/home/dev/chromedriver")
    driver = webdriver.Chrome(options=options, service=s)
    return driver

driver = getChromeDriver()
driver.get("https://www.google.com")

time.sleep(3)
driver.quit()
根因分析

报错核心原因是Chrome启动时默认在/tmp目录创建全局共享的运行时临时目录,第一个启动Chrome的普通用户会将该目录权限设置为仅自身可读写,后续其他普通用户启动Chrome时,无权限访问该目录下的DevTools监听端口文件,直接触发DevToolsActivePort file doesn't exist报错。root账号拥有系统最高权限,不受目录权限限制,因此不存在该问题。
除此之外,以下配置问题也会放大或触发同类报错:

  • 未给Chrome启动实例指定独立的用户数据目录,多用户/多实例共用同一路径引发权限冲突
  • 未指定自动分配调试端口,固定端口被之前的实例占用导致启动失败
  • Chrome与chromedriver大版本不匹配
  • /tmp目录权限异常,未配置全局可写粘滞位
解决方案

按以下步骤逐一排查修复:

  1. 为每个用户的Chrome实例指定独立的用户数据目录
    在Chrome启动参数中追加--user-data-dir配置,按用户UID生成专属临时目录路径,避免多用户共用目录产生权限冲突,示例配置:
    import os
    options.add_argument(f"--user-data-dir=/tmp/chrome-runtime-{os.getuid()}")
    
  2. 补充多实例/多用户场景适配启动参数
    在原有参数基础上追加以下配置,规避端口占用、沙箱权限、渲染相关问题:
    # 新版Chrome使用new模式headless,稳定性更高
    options.add_argument("--headless=new")
    options.add_argument("--disable-gpu")
    options.add_argument("--no-zygote")
    options.add_argument("--disable-setuid-sandbox")
    # 指定调试端口为0,让Chrome自动选择空闲端口,避免端口冲突
    options.add_argument("--remote-debugging-port=0")
    
  3. 校验Chrome与chromedriver版本匹配度
    分别执行以下命令查看版本号,确保两者大版本完全一致:
    google-chrome --version
    /home/dev/chromedriver --version
    
    若版本不匹配,替换chromedriver为和Chrome大版本对应的版本即可。
  4. 修复/tmp目录权限
    执行ls -ld /tmp确认目录权限为drwxrwxrwt(即带粘滞位的全局可写权限),若权限异常执行以下命令修复:
    sudo chmod 1777 /tmp
    
修复后完整参考代码
import time
import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

def getChromeDriver():
    options = Options()
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")
    options.add_argument("--headless=new")
    options.add_argument("start-maximized")
    options.add_argument("window-size=1900,1080")
    # 多用户适配参数
    options.add_argument(f"--user-data-dir=/tmp/chrome-runtime-{os.getuid()}")
    options.add_argument("--disable-gpu")
    options.add_argument("--no-zygote")
    options.add_argument("--disable-setuid-sandbox")
    options.add_argument("--remote-debugging-port=0")
    s = Service("/home/dev/chromedriver")
    driver = webdriver.Chrome(options=options, service=s)
    return driver

if __name__ == "__main__":
    driver = getChromeDriver()
    driver.get("https://www.google.com")
    time.sleep(3)
    driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:12:28