Подтвердить что ты не робот

Node.js поймать ошибку ENOMEM, выброшенную после икры

Мой Node.js script сбой из-за отказа ENOMEM (Out of memory) errnoException при использовании spawn.

Ошибка:

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

Полный исходный код доступен.

Есть ли что-нибудь, что я могу сделать, чтобы предотвратить сбой script? Как поймать выброшенную ошибку ENOMEM?

Спасибо!

4b9b3361

Ответ 1

У меня была такая же проблема, и, как оказалось, в моей системе было без swap-пространства. Проверьте это, выполнив команду free -m:

[email protected]:~$ 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, как я, вы можете следовать этим инструкциям при добавлении свопа файл:

  • sudo fallocate -l 4G /swapfile Создайте файл подкачки размером 4 гигабайта
  • sudo chmod 600 /swapfile Защитите файл подкачки, ограничив доступ к root
  • sudo mkswap /swapfile Отметить файл как пространство подкачки
  • sudo swapon /swapfile Включить обмен
  • echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab Персистский swap файл через перезагрузки (спасибо за подсказку, bman!)

Ответ 2

Вы можете попробовать изменить объем памяти node, используя эту команду: node ----max-old-space-size=1024 yourscript.js

- max-old-space-size = 1024 будет выделять 1 гигабайт памяти.

По умолчанию node будет использовать 512 МБ оперативной памяти, но в зависимости от вашей платформы вам может потребоваться выделить более или менее так, чтобы сбор мусора срабатывал, когда вам это нужно.

Если на вашей платформе имеется менее 500 мб доступного плунжера, попробуйте установить более низкое использование памяти в размере -max-old-space-size = 256.

Ответ 3

У меня была такая же проблема и исправлена ​​с 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

Если вы когда-нибудь сталкивались с этой проблемой в AWS Lambda, вам следует подумать об увеличении памяти, выделяемой для функции.

Ответ 5

Вы должны очистить выходы от вызываемого процесса!

Пример python выглядит следующим образом:

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