Node.js捕获spawn后抛出的ENOMEM错误

时间:2014-10-04 14:13:32

标签: javascript node.js error-handling try-catch spawn

My Node.js脚本因使用spawn时抛出的ENOMEM(内存不足)错误而崩溃。

错误:

child_process.js:935
  throw errnoException(process._errno, 'spawn');
        ^

Error: spawn ENOMEM
  at errnoException (child_process.js:988:11)
  at ChildProcess.spawn (child_process.js:935:11)
  at Object.exports.spawn (child_process.js:723:9)
  at module.exports ([...]/node_modules/zbarimg/index.js:19:23)

我已经在使用errorexit事件的侦听器,但是如果出现此错误,则不会触发它们。

我的代码:

zbarimg = process.spawn('zbarimg', [photo, '-q']);
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... }); 

完整源代码available

我能做些什么来防止脚本崩溃?如何捕获抛出的ENOMEM错误?

谢谢!

7 个答案:

答案 0 :(得分:160)

我遇到了同样的问题,事实证明,我的系统没有启用交换空间。通过运行命令free -m

检查是否是这种情况
vagrant@vagrant-ubuntu-trusty-64:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2002        233       1769          0         24         91
-/+ buffers/cache:        116       1885
Swap:            0          0          0

查看底行我们可以看到我们总共有0个字节的交换内存。不好。节点可以获得相当大的内存,如果内存耗尽时没有可用的交换空间,则必然会发生错误。

添加交换文件的方法因操作系统和发行版而异,但如果您像我一样运行Ubuntu,则可以按照instructions on adding a swap file进行操作:

  1. sudo fallocate -l 4G /swapfile创建一个4千兆字节的交换文件
  2. sudo chmod 600 /swapfile通过限制对root
  3. 的访问来保护交换文件
  4. sudo mkswap /swapfile将文件标记为交换空间
  5. sudo swapon /swapfile启用交换
  6. echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab坚持重新启动交换文件(感谢提示,bman!)

答案 1 :(得分:1)

您可以尝试使用此命令更改节点使用的内存量: node ----max-old-space-size=1024 yourscript.js

- max-old-space-size = 1024将分配1 gig的内存。

默认情况下,节点将使用512 MB的ram,但根据您的平台,您可能需要分配更多或更少的内容,以便垃圾收集在您需要时启动。

如果您的平台可用RAM少于500 mb,请尝试将内存使用率设置为--max-old-space-size = 256。

答案 2 :(得分:1)

如果您曾经在AWS Lambda中遇到此问题,则应考虑增加分配给该函数的内存。

答案 3 :(得分:0)

我遇到了同样的问题并修复了try / catch:

try {
  zbarimg = process.spawn('zbarimg', [photo, '-q']);
} catch (err) {
  console.log(err);
}
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... }); 

答案 4 :(得分:0)

我通过禁用并重新启用节点服务器来解决此问题。

答案 5 :(得分:0)

这解决了我的问题:)

内存问题

free -m
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo “/swapfile none swap sw 0 0” | sudo tee -a /etc/fstab

答案 6 :(得分:-2)

您必须刷新被调用进程的输出!

python示例如下所示:

import sys
...
sys.stdout.flush()