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

在AWS Lightsail上运行FastAPI Slack机器人时启动Selenium ChromeDriver触发SessionNotCreatedException

在AWS Lightsail上运行FastAPI Slack机器人时启动Selenium ChromeDriver触发SessionNotCreatedException

看起来你遇到的这个问题我之前部署Selenium+FastAPI服务时也踩过一模一样的坑,结合你用的AWS Lightsail Ubuntu 22.04环境,咱们一步步来解决:

先排查残留进程:是不是旧Chrome进程占着目录?

你SSH登录服务器能直接跑,但FastAPI启动就报错,大概率是之前的Chrome/ChromeDriver进程没彻底关掉,一直占着用户数据目录。先试试把所有相关进程清掉:

# 杀掉所有Chrome和ChromeDriver进程
pkill -f chrome
pkill -f chromedriver

杀完之后重启你的FastAPI服务,看看能不能正常启动。

核心问题:多Worker模式下的目录冲突

如果你的FastAPI是用多Worker启动的(比如Uvicorn加了--workers参数,或者用Gunicorn部署),每个Worker都会独立启动ChromeDriver。这时候如果所有实例用同一个--user-data-dir,肯定会冲突——Chrome的用户数据目录同一时间只能被一个Chrome实例占用。

解决办法很直接:给每个进程分配唯一的用户数据目录,比如用当前进程的PID(进程ID)生成专属目录:

import os
import tempfile

# 生成带当前进程ID后缀的唯一临时目录,确保每个Worker的目录都不重复
unique_data_dir = tempfile.mkdtemp(suffix=f"_{os.getpid()}")
chrome_options.add_argument(f"--user-data-dir={unique_data_dir}")

这样每个Worker的目录都是独一无二的,就不会互相抢资源了。

权限排查:FastAPI运行用户有没有目录读写权?

你SSH登录用的是ubuntu用户,权限拉满,但FastAPI服务可能是用其他用户运行的(比如www-data,或者部署时指定的非root用户)。这时候就算你指定了静态目录,这个用户可能没权限读写,导致Chrome无法初始化目录,进而报出误导性的“目录已被占用”错误。

如果要用静态目录,先把权限配对:

# 先创建目录
sudo mkdir -p /home/ubuntu/mytmp/
# 如果你知道FastAPI的运行用户(比如www-data),直接给这个用户赋权
sudo chown -R www-data:www-data /home/ubuntu/mytmp/
# 要是不知道,临时开全权限测试(生产环境别这么干,排查用)
sudo chmod 777 /home/ubuntu/mytmp/

另外,用完Chrome之后一定要调用driver.quit()而不是driver.close()——close只会关掉当前标签页,Chrome进程还在后台跑,会一直占着目录;quit会彻底杀掉Chrome进程,释放目录资源。

补充:服务器端Chrome的必备配置

在Ubuntu服务器上跑无头Chrome,建议加上这些参数,避免一些奇奇怪怪的环境问题:

chrome_options.add_argument("--headless=new")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")

--no-sandbox在Ubuntu环境下几乎是必须的,因为默认沙箱机制需要特殊权限,服务器环境一般满足不了;--disable-dev-shm-usage是避免服务器上/dev/shm分区过小导致Chrome崩溃。

备注:内容来源于stack exchange,提问作者miorey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 20:09:29