使用spawn时,由于抛出了ENOMEM(内存不足)errnoException,我的Node.js脚本崩溃了。

错误:

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错误?

谢谢!

最佳答案

我遇到了同样的问题,事实证明,我的系统没有启用的交换空间。通过运行命令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:
  • sudo fallocate -l 4G /swapfile创建一个4 GB的交换文件
  • sudo chmod 600 /swapfile通过限制对根
  • 的访问来保护交换文件
  • sudo mkswap /swapfile将文件标记为交换空间
  • sudo swapon /swapfile启用交换
  • echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab在重启后持久交换文件(感谢提示,bman!)
  • 07-24 15:39