我正在尝试运行一个需要相当长时间才能完成的 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 脚本与单元测试运行程序结合起来。当您的脚本与测试运行程序结合使用时,您可以在测试运行之前和之后执行有用的
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()
您需要在
driver.close()
之前调用 driver.quit()
,否则您会遇到资源使用率很高的持久 chrome 进程。这是最新 chrome 版本 (124+) 的问题。