You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何清理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

关键修改点说明

  1. 精准关联进程:通过pgrep -P逐级查找当前脚本的子进程chromedriver,再定位到chromedriver对应的Chrome主进程,仅清理该主进程下带--type标记的冗余子进程,彻底避免误杀Chrome主进程或无关进程。
  2. 持续循环清理:清理完成后重置start_time而非break循环,实现脚本运行期间每小时自动清理一次冗余进程。
  3. 启动前清理优化:启动时仅清理python3 main.py相关进程,避免误杀其他Python程序;清理Chrome时只针对带--type的子进程,确保旧冗余进程被彻底清理。
  4. 退出判断优化:直接通过日志最后一行的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 03:22:48