同一时刻运行Selenium/Chromedriver两次触发SessionNotCreatedException错误
同一秒触发两次Python截图脚本时出现SessionNotCreatedException错误
我有一段按需执行的Python代码,用于对本地部署的HTTPS网站截图,存在同一秒内被触发两次的可能。若两次执行间隔至少一秒,代码可正常运行数百次;但同一秒运行时,其中一次会抛出如下错误:
Traceback (most recent call last): File "/home/trading/python/screenshot_rsi.py", line 37, in <module> driver = webdriver.Chrome(options=options) File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/chrome/webdriver.py", line 80, in __init__ super().__init__( File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/chromium/webdriver.py", line 104, in __init__ super().__init__( File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 286, in __init__ self.start_session(capabilities, browser_profile) File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 378, in start_session response = self.execute(Command.NEW_SESSION, parameters) File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute self.error_handler.check_response(response) File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.SessionNotCreatedException: Message: session not created: Chrome failed to start: exited normally. (chrome not reachable) (The process started from chrome location /snap/bin/chromium is no longer running, so ChromeDriver is assuming that Chrome has crashed.) Stacktrace: #0 0x56223f1c45e3 <unknown> #1 0x56223ee870b7 <unknown> #2 0x56223eebde55 <unknown> #3 0x56223eebab81 <unknown> #4 0x56223ef0547f <unknown> #5 0x56223eefbcc3 <unknown> #6 0x56223eec70e4 <unknown> #7 0x56223eec80ae <unknown> #8 0x56223f18ace1 <unknown> #9 0x56223f18eb7e <unknown> #10 0x56223f1784b5 <unknown> #11 0x56223f18f7d6 <unknown> #12 0x56223f15bdbf <unknown> #13 0x56223f1b2748 <unknown> #14 0x56223f1b2917 <unknown> #15 0x56223f1c3773 <unknown> #16 0x7f28612c1609 start_thread
已尝试的调试方法
- 添加/移除配置选项
- 使用独立的
--profile-directory、--user-data-dir - 指定不同固定端口
- 添加/移除
driver.quit() - 创建两个脚本分别命名driver1和driver2
以上方法均无法解决问题。
当前使用的Python代码
import argparse import random import string from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from multiprocessing import Process # Function to generate a random filename def generate_random_filename(): characters = string.ascii_uppercase + string.digits return ''.join(random.choice(characters) for _ in range(20)) # Parse command-line arguments parser = argparse.ArgumentParser(description='Capture a screenshot of page.') parser.add_argument('--time', type=str, required=True, help='The time.') args = parser.parse_args() min_port = 9000 max_port = 9999 random_port = random.randint(min_port, max_port) options = webdriver.ChromeOptions() options.binary_location = '/snap/bin/chromium' options.add_argument("--user-data-dir=/tmp-chromium") options.add_argument("--start-maximized") options.add_argument(r'--profile-directory=Profile2') options.add_argument('--no-sandbox') options.add_argument("--disable-setuid-sandbox") options.add_argument(f"--remote-debugging-port={random_port}") options.add_argument('--headless=new') options.add_argument('--disable-gpu') options.add_argument('--hide-scrollbars') driver = webdriver.Chrome(options=options) driver.set_window_size(2200, 1200) url = f"https://my.url/page?time={args.time}" driver.get(url) try: max_wait_time = 10 # Adjust this according to your needs WebDriverWait(driver, max_wait_time).until( EC.presence_of_element_located((By.CLASS_NAME, "cssSelector")) ) screenshot_filename = generate_random_filename() screenshot_path = f"/var/www/html/screenshots/{screenshot_filename}.png" driver.save_screenshot(screenshot_path) print(screenshot_path) except Exception as e: print(f"An error occurred: {e}")
版本信息
- Chromium 119.0.6045.105 snap
- ChromeDriver 119.0.6045.105
解决思路与方案
使用独立临时用户数据目录
两个进程共用/tmp-chromium会触发文件锁冲突,应为每个进程生成唯一临时目录:import tempfile import shutil # 创建临时目录 user_data_dir = tempfile.mkdtemp(prefix="chromium_") options.add_argument(f"--user-data-dir={user_data_dir}") # 脚本结束后清理目录 try: # 截图逻辑... finally: if 'driver' in locals(): driver.quit() shutil.rmtree(user_data_dir)避免端口冲突
随机端口仍有极小概率撞车,可取消指定--remote-debugging-port,让Chromium自动分配端口;或添加端口检测逻辑,确保使用未被占用的端口。添加进程锁或启动延迟
- 文件锁:用文件锁限制同一时间只有一个实例启动:
import fcntl import time lock_file = open("/tmp/screenshot_lock", "w") try: fcntl.flock(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB) # 启动Chromium代码 except BlockingIOError: time.sleep(0.5) # 重试或退出 finally: lock_file.close() - 随机延迟:在脚本开头添加
time.sleep(random.uniform(0, 0.5)),分散启动时间。
- 文件锁:用文件锁限制同一时间只有一个实例启动:
修复资源释放逻辑
当前代码未调用driver.quit(),导致残留进程积累,应在finally块中确保关闭浏览器:try: # 截图逻辑 except Exception as e: print(f"An error occurred: {e}") finally: if 'driver' in locals(): driver.quit()检查Snap权限限制
Snap版本Chromium可能有沙箱限制,尝试改用Debian包安装的Chromium,或调整Snap权限:sudo snap install chromium --classic
内容的提问来源于stack exchange,提问作者theplau
相关产品推荐
相关产品推荐

