我正在执行一个大约15000次的phantomjs脚本,一遍又一遍地执行不同的网页。我正在使用自己创建的队列系统,因此我只使用方法execFile
运行2个进程。 (队列如何一次生成/组合,但队列的大小,用sizeof测量,只有大约20mb)
过了一会儿,我的nodejs脚本开始向我发回这条消息:
{ [Error: Command failed: /home/ec2-user/bot/node_modules/phantomjs/lib/phantom/bin/phantomjs /home/ec2-user/bot/phantomjs-script.js http://www.example.com/foo/bar
]
killed: true,
code: null,
signal: 'SIGTERM',
cmd: '/home/ec2-user/bot/node_modules/phantomjs/lib/phantom/bin/phantomjs /home/ec2-user/bot/phantomjs-script.js http://www.example.com/foo/bar' }
如果我然后重新启动脚本,则会从nodejs脚本的开头抛出这些消息 如果我退出并重新登录,那么我可以在再次出现这些消息之前运行脚本,就像第一次运行脚本一样。
对我而言,这听起来像是内存/堆/垃圾回收问题。但似乎无法找到有关如何处理的任何信息,除了确定使用多少内存的不同方法。结论是脚本使用的内存非常大,介于20-500 mb之间,用memoryUsage
...导致此错误最终被抛出:
child_process.js:1155
throw errnoException(err, 'spawn');
^
Error: spawn ENOMEM
at exports._errnoException (util.js:746:11)
at ChildProcess.spawn (child_process.js:1155:11)
at exports.spawn (child_process.js:988:9)
at Object.exports.execFile (child_process.js:682:15)
at /home/ec2-user/bot/main.js:66:20
at worker (/home/ec2-user/bot/main.js:20:9)
at wrapper [as _onTimeout] (timers.js:265:14)
at Timer.listOnTimeout (timers.js:110:15)
这个问题解释了这个错误Node.js catch ENOMEM error thrown after spawn这里的解决方案似乎是花费你的记忆,但我真的认为我当时不需要超过500mb的内存来读取2个网页。 / p>
我意识到我的问题可能是本地的,遗憾的是我没有代码可以告诉你我认为问题可能在哪里。对我而言,这一切看起来都很好 - 脚本很大,可以转移到这里..
我迷失在这里,并试图弄清楚它已经2天没有取得任何成功,所以我觉得编译问我是否有其他人像我上面解释的那样,对phanomjs或子进程有问题,并且如果是的话,我能做些什么呢?