2014-10-04 2 views
46

Сценарий моего Node.js из-за возникшей ошибки ENOMEM (Out of memory) errnoException при использовании spawn.Node.js улавливает ошибку 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) 

Я уже использую слушатель для события error и exit, но не из них увольняет в случае этой ошибки.

Мой код:

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

Полный исходный код available.

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

Спасибо!

+0

У вас есть пример изображения, которое может использоваться для репликации вопроса? – mscdex

+0

Это происходит, когда сервер не имеет памяти и не может быть воспроизведен с определенным изображением. Это затрудняет тестирование: -/ – tobi

+0

Что вы делаете внутри обработчика 'error'? – mscdex

ответ

1

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

--max-старо-пространство размера = 1024 будет выделен 1 Гб памяти.

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

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

0

У меня была такая же проблема, и фиксировались Try/уловом:

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

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

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

import sys 
... 
sys.stdout.flush() 
Смежные вопросы