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目录权限异常,未配置全局可写粘滞位
解决方案
按以下步骤逐一排查修复:
- 为每个用户的Chrome实例指定独立的用户数据目录
在Chrome启动参数中追加--user-data-dir配置,按用户UID生成专属临时目录路径,避免多用户共用目录产生权限冲突,示例配置:import os options.add_argument(f"--user-data-dir=/tmp/chrome-runtime-{os.getuid()}") - 补充多实例/多用户场景适配启动参数
在原有参数基础上追加以下配置,规避端口占用、沙箱权限、渲染相关问题:# 新版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") - 校验Chrome与chromedriver版本匹配度
分别执行以下命令查看版本号,确保两者大版本完全一致:
若版本不匹配,替换chromedriver为和Chrome大版本对应的版本即可。google-chrome --version /home/dev/chromedriver --version - 修复/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
相关产品推荐
相关产品推荐

