终止由 Chromium 和 Selenium WebDriver 创建的不必要的 chrome 进程

问题描述 投票:0回答:2

我正在尝试运行一个需要相当长时间才能完成的 Selenium WebDriver 脚本。问题是,在我的服务器上执行上述脚本时,大约一个半小时后,之前需要 10 秒才能完成的操作现在只需要大约 2 分钟,这使得执行速度极其缓慢。分析问题可能出在哪里,我发现在执行过程中创建了几个 crhome 进程。例如,当我第一次创建执行时,我有 4 个 chrome 进程,而当执行花费了几个小时执行时,已经创建了 24 个进程。

我有以下脚本,如果在执行过程中引发异常,则尝试重新运行脚本,并尝试删除不必要的 chrome 进程以每小时释放资源,但似乎这不起作用,因为这不是我想要的为此,这会终止主要的 chrome 进程,这意味着它会导致脚本停止并必须从 shell 重新运行它(因此只会执行 10 小时的执行,每次尝试一次)。有什么方法可以只摆脱这个脚本中不必要的 chrome 进程吗?

max_attempts=10
attempt=1
log_file="../logs/execution_log_$(date +"%d%m%Y").txt"
while [ $attempt -le $max_attempts ]; do
  # Kill any running instances of python3, chromedriver, chrome and google-chrome-stable
  pkill -f "python3"
  pkill -f "chromedriver"
  pkill -f "chrome"
  pkill -f "google-chrome-stable"

  # Run script with nohup
  nohup python3 main.py >> "$log_file" 2>&1 &

  # Store the process ID of the script
  script_pid=$!

  start_time=$(date +%s)

  # Wait for the script to finish or check if it is still running
  while ps -p $script_pid > /dev/null; do
    sleep 5
    # Check if the elapsed time exceeds 1 hour (3600 seconds)
    current_time=$(date +%s)
    elapsed_time=$((current_time - start_time))
    if [ $elapsed_time -ge 3600 ]; then
        echo "$(date) Killing zombie Chrome processes..."
        # Kill all chrome processes except for the oldest
        pkill -f "chrome --type=zygote"
        pkill -f "chrome --type=renderer"
        pkill -f "chrome --type=gpu-process"
        pkill -f "chrome --type=utility"
        break
    fi
  done
  echo "$(date) The command has stopped"

  exit_code=$?
  # Check if exit code is different from 0 and if the execution log file's last line is equal to the literal String to break the loop
  if [ $exit_code -ne 0 ] && [ "$(tail -n 1 "$log_file")" = "ENDOF SCRIPT" ]; then
    echo "$(date) Script completed successfully with exit code 0."
    break
  else
    echo "$(date) Script exited with code $exit_code."
    # If it's the last attempt, print a failure message and exit
    if [ $attempt -eq $max_attempts ]; then
      echo "$(date) Maximum attempts reached. Script failed."
      # Kill any running instances of python3, chromedriver, chrome and google-chrome-stable
      pkill -f "python3"
      pkill -f "chromedriver"
      pkill -f "chrome"
      pkill -f "google-chrome-stable"
      exit 1
    fi

    echo "$(date) Restarting command..."
    attempt=$((attempt + 1))
  fi
done
selenium-webdriver chromium chrome-web-driver
2个回答
0
投票

我不确定您是否已经这样做了,但如果没有,您可以将 Selenium 脚本与单元测试运行程序结合起来。当您的脚本与测试运行程序结合使用时,您可以在测试运行之前和之后执行有用的

setUp
tearDown
操作。例如,即使发生错误,Selenium 资源也应该正确关闭/处置。 (而且我不确定你的 Selenium 脚本是用哪种语言编写的,所以我只是添加了一个 Python 示例......)

import unittest

from selenium import webdriver

class Tests(unittest.TestCase):
    def setUp(self):
        # create a new Chrome session
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.driver.maximize_window()
        # navigate to the application home page
        self.driver.get("https://www.google.com/")

    def test(self):
        # your test code

    def tearDown(self):
        # close the browser window
        self.driver.quit()

0
投票

您需要在

driver.close()
之前调用
driver.quit()
,否则您会遇到资源使用率很高的持久 chrome 进程。这是最新 chrome 版本 (124+) 的问题。

© www.soinside.com 2019 - 2024. All rights reserved.