2014-10-04 12 views
46

Mein Node.js-Skript stürzt wegen eines geworfenen ENOMEM (nicht genügend Arbeitsspeicher) errnoException ab, wenn spawn verwendet wird.Node.js fangen ENOMEM-Fehler nach Spawn

Der Fehler:

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) 

Ich verwende bereits Zuhörer für das error und exit Ereignis, aber nicht von ihnen bei diesem Fehler gefeuert.

Mein Code:

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

Der vollständige Quellcode available.

Kann ich irgendetwas tun, um zu verhindern, dass das Skript abstürzt? Wie erhalte ich den geworfenen ENOMEM Fehler?

Danke!

+0

Haben Sie ein Beispiel Bild, das verwendet werden kann, um das Problem zu replizieren? – mscdex

+0

Dies tritt auf, wenn der Server nicht genügend Arbeitsspeicher hat und nicht mit einem bestimmten Image reproduziert werden kann. Das macht es schwer zu testen: -/ – tobi

+0

Was machst du im 'Fehler' Handler? – mscdex

Antwort

1

Sie können versuchen, die Menge an Speicherknoten zu ändern verwendet, um mit diesem Befehl: node ----max-old-space-size=1024 yourscript.js

--max-old-Raum-size = 1024 1 GB Speicher zuteilen wird.

Standardmäßig verwendet der Knoten 512 MB RAM, aber abhängig von Ihrer Plattform müssen Sie möglicherweise mehr oder weniger zuweisen, damit die Garbage Collection bei Bedarf eingesetzt wird.

Wenn auf Ihrer Plattform weniger als 500 MB RAM verfügbar sind, versuchen Sie, die Speicherauslastung auf --max-old-space-size = 256 zu setzen.

0

ich das gleiche Problem habe und fixiert mit 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

Sie haben die Ausgänge spülen aus dem aufgerufenen Prozess!

Ein Python Beispiel sieht wie folgt aus:

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