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

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

错误:

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) { ... }); 

完整的源代码可用 。

有什么我可以做,以防止脚本崩溃? 如何捕捉抛出的ENOMEM错误?

谢谢!

我有同样的问题,事实certificate,我的系统没有启用交换空间 。 通过运行命令检查是否是这种情况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,则可以按照以下说明添加交换文件 :

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

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

–max-old-space-size = 1024会分配1个内存。

默认情况下,节点将使用512 MB RAM,但根据您的平台,您可能需要分配更多或更less的数据,以便在需要时进行垃圾回收。

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

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

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

您必须清除被调用进程的输出!

一个python示例如下所示:

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