由PhantomJS

时间:2017-03-07 07:40:47

标签: shell phantomjs out-of-memory

我的shell脚本是用 cygwin for windows 编写的:

// main.sh
#!/bin/bash
[ "$#" -lt 1 ] && echo "Usage: thisscript.sh <filename.txt>" && exit 0
filename=`basename -s .txt $1`    
i=0
while [ $i == 0 ]
do
  phantomjs --web-security=no myXHR.js $filename.txt
  logLastLine=`tail -n 1 $filename.log`
  if [[ "$logLastLine" =~ "Error" ]]; then
    echo "Error occurs, now keep looping it..."
  elseif [[ "$logLastLine" =~ "503" ]]; then
    echo "Error occurs, now keep looping it..."
  elseif [[ "$logLastLine" =~ "500" ]]; then
    echo "Error occurs, now keep looping it..."
  else
    echo "Complete! Exiting the execution..."
    i=1
  fi
done

以下是myXHR.js

中包含的代码
// myXHR.js

phantom.onError = function(msg, trace) {
  console.log("PhantomJS Error");
  phantom.exit();
};


var fs = require('fs'), system = require('system');

if (system.args.length < 2) {
  console.log("Usage: myXHR.js <FILE>");
}

var content = '',
  f = null,
  lines = null,
  eol = "\n";

try {
  f = fs.open(system.args[1], "r");
  filename=system.args[1].replace(/\.txt/,"");
  content = f.read();
} catch (e) {
  console.log(e);
}

if (f) {
  f.close();
}

var request = new XMLHttpRequest();

if (content) {
  lines = content.split(eol);
  for (i=0; i<(lines.length-1);i++) {

  request.open('GET', "http://stackoverflow.com/", false);
  request.send();
  if (request.status === 200) {
    try { 
      fs.write($filename.log, line[i] + "Succeed!", 'a');
    } catch(e) {
      console.log(e);
    }
  } else {  
    try { 
      fs.write($filename.log, line[i] + "Error!", 'a');
    } catch(e) {
      console.log(e);
    }
  }
}
phantom.exit();

为了说明,由PhantomJS 执行的 javascript正在读取第一个参数(一个filename.txt文件),逐行传递到shell脚本中。对于每一行,它发送XMLHttpRequest以检查请求状态并将其写入filename.log文件。

错误状态编号包括503和500 。幸运的是,如果我重新发送相同的XMLHttpRequest,这些状态不太可能再次发生。所以我需要做的是设置一个错误处理程序,用于在发生错误时重新发送相同的XMLHttpRequest。

在此错误处理程序中,我使用X=${tail -n 1 log}查看是否存在错误状态编号(包含&#34; 503&#34;或&#34; 500&#34;字符串)。例如,if [[ "$X" =~ "503" ]]; then重新启动javascript的执行,不给予i=1并且while循环永不退出。直到它已完成读取导入文件的最后一行而没有任何错误状态编号。 (我知道处理这样的错误很尴尬,但这是我想到的一个快速解决方案。)

但这是理论上的。在实践中,此脚本以错误&#34;内存耗尽&#34; 结束。我认为此错误是由$1文件中的大量行(> 100k)触发的,它发生在JavaScript执行部分中。我使用free -m命令来获取内存使用信息,我注意到当Javascript运行时,使用的交换正在增加

任何人都可以教我如何在执行脚本时释放内存。

0 个答案:

没有答案