2014-10-04 11 views
46

Skrypt My Node.js ulega awarii z powodu wygenerowanego wyjątku errnoException ENOMEM (brak pamięci) podczas korzystania z spawn.Błąd Node.js Błąd ENOMEM zgłoszony po odrodzeniu

Błąd:

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) 

już używam słuchaczy na imprezę error i exit, ale nie z nich wyrzucenie w przypadku tego błędu.

Mój kod:

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

Pełny kod źródłowy available.

Czy jest coś, co mogę zrobić, aby zapobiec zawieszaniu się skryptu? Jak złapać wyrzucony błąd ENOMEM?

Dzięki!

+0

Czy masz przykładowy obraz, który może być używany do replikowania problem? – mscdex

+0

Zdarza się, gdy serwerowi brakuje pamięci i nie można go odtworzyć przy użyciu określonego obrazu. To sprawia, że ​​trudno przetestować: -/ – tobi

+0

Co robisz wewnątrz programu obsługi "błędu"? – mscdex

Odpowiedz

1

Można spróbować zmienić ilość pamięci węzła korzysta z tego polecenia: node ----max-old-space-size=1024 yourscript.js

--max-old-space-size = 1024 przeznaczy 1 koncert pamięci.

Domyślnie węzeł użyje 512 MB pamięci RAM, ale w zależności od platformy konieczne może być przydzielenie większej lub mniejszej ilości pamięci, aby kolekcja śmieci była uruchamiana w razie potrzeby.

Jeśli Twoja platforma ma mniej niż 500 MB pamięci RAM, spróbuj ustawić zużycie pamięci niższe na --max-old-space-size = 256.

0

miałem ten sam problem i utrwalano try/catch:

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

Trzeba opróżnić wyjść od wezwanego procesu!

przykładem pyton wygląda następująco:

import sys 
... 
sys.stdout.flush() 
Powiązane problemy