如何清理Chromium与Selenium WebDriver生成的冗余Chrome进程
解决Selenium脚本冗余Chrome进程清理问题
你的脚本会误杀Chrome主进程,核心原因是清理时未精准定位当前脚本关联的进程,且每小时清理后就停止监控脚本运行状态。以下是修改后的脚本及关键说明:
修改后的完整脚本
max_attempts=10 attempt=1 log_file="../logs/execution_log_$(date +"%d%m%Y").txt" while [ $attempt -le $max_attempts ]; do # 启动前仅清理当前脚本相关的旧进程,避免误杀其他无关进程 pkill -f "python3 main.py" pkill -f "chromedriver" pkill -f "chrome --type=" # 启动目标脚本 nohup python3 main.py >> "$log_file" 2>&1 & script_pid=$! start_time=$(date +%s) # 持续监控脚本运行,每小时清理一次冗余进程 while ps -p $script_pid > /dev/null; do sleep 5 current_time=$(date +%s) elapsed_time=$((current_time - start_time)) if [ $elapsed_time -ge 3600 ]; then echo "$(date) 清理当前脚本关联的冗余Chrome子进程..." # 1. 找到当前脚本的子进程chromedriver的PID chromedriver_pids=$(pgrep -P $script_pid chromedriver) # 2. 找到chromedriver对应的Chrome主进程PID chrome_pids=$(for pid in $chromedriver_pids; do pgrep -P $pid chrome; done) # 3. 仅清理Chrome主进程下的冗余子进程(带--type标记的) if [ -n "$chrome_pids" ]; then for chrome_pid in $chrome_pids; do child_chrome_pids=$(pgrep -P $chrome_pid | xargs ps -o args= -p | grep "chrome --type=" | awk '{print $1}') if [ -n "$child_chrome_pids" ]; then kill $child_chrome_pids echo "$(date) 已清理冗余进程PID: $child_chrome_pids" fi done fi # 重置计时,实现每小时自动清理 start_time=$(date +%s) fi done echo "$(date) 脚本停止运行" exit_code=$? # 判断脚本是否成功完成 if [ "$(tail -n 1 "$log_file")" = "ENDOF SCRIPT" ]; then echo "$(date) 脚本执行成功" break else echo "$(date) 脚本退出码: $exit_code" if [ $attempt -eq $max_attempts ]; then echo "$(date) 已达最大重试次数,脚本执行失败" pkill -f "python3 main.py" pkill -f "chromedriver" pkill -f "chrome --type=" exit 1 fi echo "$(date) 准备重启脚本..." attempt=$((attempt + 1)) fi done
关键修改点说明
- 精准关联进程:通过
pgrep -P逐级查找当前脚本的子进程chromedriver,再定位到chromedriver对应的Chrome主进程,仅清理该主进程下带--type标记的冗余子进程,彻底避免误杀Chrome主进程或无关进程。 - 持续循环清理:清理完成后重置
start_time而非break循环,实现脚本运行期间每小时自动清理一次冗余进程。 - 启动前清理优化:启动时仅清理
python3 main.py相关进程,避免误杀其他Python程序;清理Chrome时只针对带--type的子进程,确保旧冗余进程被彻底清理。 - 退出判断优化:直接通过日志最后一行的
ENDOF SCRIPT标记判断脚本是否成功,避免nohup返回的exit_code不准确的问题。
额外优化建议
- 在
main.py中,每次关闭浏览器时务必调用driver.quit()(而非driver.close()),确保Chrome进程被正确回收,从源头减少冗余进程生成。 - 给Chrome添加启动参数限制资源:比如
--disable-dev-shm-usage、--no-sandbox、--memory-pressure-offload=1,降低内存占用和进程泄漏概率。
内容的提问来源于stack exchange,提问作者user21848941
相关产品推荐
相关产品推荐

