Ubuntu16下sudo/Celery任务运行Selenium时Chromium驱动报错
解决Ubuntu16下sudo/Celery环境中Selenium Chrome驱动执行失败的问题
我之前在Ubuntu16上踩过一模一样的坑!手动跑Python脚本时Selenium Chrome驱动完全正常,但一用sudo执行或者丢给Celery任务跑就直接报错,核心原因其实是无图形界面权限和用户环境差异在搞鬼,给你整理几个亲测有效的解决办法:
1. 强制启用Headless无头模式+必要参数
sudo或者Celery运行环境通常没有桌面会话,Chrome默认需要图形界面才能启动,必须开启无头模式,还要加上几个针对root/无权限环境的参数:
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 配置Chrome选项 chrome_options = Options() chrome_options.add_argument('--headless') # 无头模式,无需显示界面 chrome_options.add_argument('--no-sandbox') # 关键!root用户运行必须关闭沙箱,否则直接报错 chrome_options.add_argument('--disable-dev-shm-usage') # 解决Ubuntu默认/dev/shm空间不足导致的崩溃 chrome_options.add_argument('--disable-gpu') # 禁用GPU加速,无头模式下不需要 # 初始化驱动 driver = webdriver.Chrome( executable_path='/usr/lib/chromium-browser/chromedriver', options=chrome_options )
这几个参数是刚需,尤其是--no-sandbox,root用户运行Chrome时默认会强制启用沙箱,但root本身不能用沙箱,所以必须手动关闭。
2. 统一环境变量与用户权限
手动运行是当前普通用户,sudo是root,Celery可能用的是www-data或其他系统用户,不同用户的环境变量、Chrome路径甚至依赖库权限都不一样:
- 指定Chrome二进制文件路径:有时候root用户的PATH里找不到Chrome,直接指定完整路径更稳妥:
chrome_options.binary_location = '/usr/bin/chromium-browser' # 根据你的实际路径调整 - 让Celery以普通用户身份运行:如果Celery默认用root或www-data执行,改成你手动跑脚本的用户,环境就完全一致了。比如启动Celery时加参数:
celery -A your_project worker --user=your_username --loglevel=info - 检查权限:确保chromedriver文件有可执行权限,并且所有运行用户都能访问:
sudo chmod +x /usr/lib/chromium-browser/chromedriver sudo chmod 755 /usr/lib/chromium-browser/chromedriver # 给所有用户加读写执行权限
3. 验证Chrome与Chromedriver版本匹配
虽然手动运行正常,但不同用户下的Chrome版本可能有差异(比如普通用户装了新版Chrome,root用的是系统默认旧版)。分别在普通用户和sudo下执行以下命令,确保版本大号一致:
# 普通用户下 chromium-browser --version chromedriver --version # sudo下 sudo chromium-browser --version sudo chromedriver --version
如果版本不匹配,去下载对应版本的chromedriver替换即可。
额外排查技巧
如果还是报错,可以在sudo环境下直接运行chromedriver命令,看有没有具体的错误提示;或者在Celery任务里加日志,打印当前用户、环境变量、Chrome路径等信息,方便定位到底是哪一步出了问题。
内容的提问来源于stack exchange,提问作者vmenezes
相关产品推荐
相关产品推荐

