使用selineum + chromeDriver 的时候,发现运行一个周期后调用摧毁downloader的时候,webdriver有时候并不会关闭,这样运行时间长以后,死掉的chrome越来越多,内存就爆了。
在服务器上,可以在源码或者在调用spider.run()结束后,运行脚本将现有的chrome进程干掉:
String[] cmd = {"/bin/sh","-c","ps -ef|grep chrome |grep -v grep | cut -c 9-15|xargs kill -s 9"};
CommonUtils.exec(cmd,false);//干掉chrome程序,防止爆内存
/**
* 执行linux 命令行
* @param cmd 要执行的命令
* @param force 是否强制执行,不强制执行的话先检测是否在linux环境
**/
public static void exec(String[] cmd,boolean force){
logger.info("即将执行的命令行:"+ Arrays.toString(cmd));
if(force || (!force && judgeSystem("linux"))){
try {
logger.info("执行命令行:"+ Arrays.toString(cmd));
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while((line = reader.readLine())!=null){
logger.info("执行 cmd 返回结果:"+line);
}
}catch (Exception e){
logger.error(e.getMessage());
}
}
}
/**
* 检测是系统
* @param system 期望的系统环境,eg.linux\windows
**/
public static boolean judgeSystem (String system){
String systemName = System.getProperty("os.name").toLowerCase();
logger.info("期望系统是:"+system+",当前系统是:"+systemName);
return systemName.contains(system);
}
这里有个问题是如果没有chrome残存的,这部分代码会卡一段时间。
另外可以更改downloader,更改为采用ChromeDriverService管理webdriver,未尝试。