我的 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)
我已经在为 error
和 exit
事件使用监听器,但如果出现此错误,它们都不会被触发。
我的代码:
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 字节的交换内存。不好。 Node 可能会占用大量内存,如果内存耗尽时没有可用的交换空间,则必然会发生错误。
添加交换文件的方法因操作系统和发行版而异,但如果你像我一样运行 Ubuntu,你可以按照这些 instructions on adding a swap file :
sudo fallocate -l 4G/swapfile
创建一个 4 GB 的交换文件sudo chmod 600/swapfile
通过限制对 root 的访问来保护交换文件sudo mkswap/swapfile
将文件标记为交换空间sudo swapon/swapfile
启用交换echo "/swapfile none swap sw 0 0"| sudo tee -a/etc/fstab
在重启后保留交换文件(感谢提示,bman !)
关于javascript - Node.js 捕获生成后引发的 ENOMEM 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26193654/