django 使用Supervisor时,Selenium无法访问celery任务中的Chrome

6pp0gazn  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(118)

我有一个Django项目,使用Celery作为任务队列。这个任务是关于通过Selenium运行一个chromedriver并从一些URL中获取数据。就像这样:

@shared_task(bind=True)
def task_one(self):
    options = Options()
    options.add_argument("--start-maximized")
    options.add_argument('--no-sandbox')
    options.add_argument("--disable-dev-shm-usage")
    driver = webdriver.Chrome(options=options)
    wait = WebDriverWait(driver, 20)
    action = ActionChains(driver)
    driver.get('https://somewhere.com')
    # do others

这个任务应该定期运行,因为我使用celery beat。
为了测试,我在两个终端上运行了celery worker和celery beat,一切似乎都没问题。(celery beat每20秒发送一次,worker运行Chrome并获取数据)
但是当我使用Supervisor时,工作进程出错,无法访问Chrome。(celery 节拍仍然工作得很好,每20秒发送一次,但问题出在工人身上)
celery 日志说:

'Message: session not created: Chrome failed to start: exited normally.
  (chrome not reachable)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Stacktrace:
#0 0x562b0da106c3 <unknown>
#1 0x562b0d6e61e7 <unknown>
#2 0x562b0d719526 <unknown>
#3 0x562b0d71569c <unknown>
#4 0x562b0d75823a <unknown>
#5 0x562b0d74ee93 <unknown>
#6 0x562b0d721934 <unknown>
#7 0x562b0d72271e <unknown>
#8 0x562b0d9d5cc8 <unknown>
#9 0x562b0d9d9c00 <unknown>
#10 0x562b0d9e41ac <unknown>
#11 0x562b0d9da818 <unknown>
#12 0x562b0d9a728f <unknown>
#13 0x562b0d9fee98 <unknown>
#14 0x562b0d9ff069 <unknown>
#15 0x562b0da0f853 <unknown>
#16 0x7f0c29a97b43 <unknown>
'}
fslejnso

fslejnso1#

我可以通过使用以下参数指定chromedriver路径来解决这个问题。
因为我在Ubuntu服务器上运行我的脚本,它看起来像这样:

chrome_options.add_argument("--headless")
    chrome_options.add_argument("--block-images")
    chrome_options.add_argument("--disable-dev-shm-usage")
    chrome_path = "/usr/local/bin/chromedriver-linux64/chromedriver"
    service = Service(executable_path=chrome_path)
    driver = webdriver.Chrome(service=service,
                                   options=chrome_options)

相关问题