我的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运行时,使用的交换正在增加!
任何人都可以教我如何在执行脚本时释放内存。