parse nodejs node handling error javascript node.js error-handling try-catch spawn

javascript - nodejs - node js error handling



Node.js atrapa el error ENOMEM lanzado después del desove (4)

La secuencia de comandos My Node.js se bloquea debido a una excepción erronException ENOMEM (sin memoria) lanzada cuando se utiliza spawn .

El error:

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)

Ya estoy usando escuchas para el error y el evento de exit , pero ninguno de ellos se activa en caso de este error.

Mi código:

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

Código fuente completo available .

¿Hay algo que pueda hacer para evitar que el script se bloquee? ¿Cómo detecto el error ENOMEM lanzado?

¡Gracias!


He tenido el mismo problema y se ha corregido con try / catch:

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


Puede intentar cambiar la cantidad de usos de nodo de memoria con este comando: node ----max-old-space-size=1024 yourscript.js

--max-old-space-size = 1024 asignará 1 gigabyte de memoria.

Por defecto, el nodo utilizará 512 mb de RAM, pero dependiendo de su plataforma, es posible que deba asignar más o menos para que la recolección de basura se active cuando la necesite.

Si su plataforma tiene menos de 500 mb de RAM disponible, intente ajustar el uso de memoria a --max-old-space-size = 256.


Tienes que vaciar las salidas del proceso llamado!

Un ejemplo de python se ve así:

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


Tuve el mismo problema y resultó que mi sistema no tenía espacio de intercambio habilitado . Compruebe si este es el caso ejecutando el comando 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

Mirando la fila inferior, podemos ver que tenemos un total de 0 bytes de memoria de intercambio. No está bien. El nodo puede tener bastante memoria y si no hay espacio de intercambio disponible cuando se agota la memoria, es probable que se produzcan errores.

El método para agregar un archivo de intercambio varía según los sistemas operativos y las distribuciones, pero si está ejecutando Ubuntu como yo, puede seguir estas instrucciones para agregar un archivo de intercambio :

  1. sudo fallocate -l 4G /swapfile Crea un swapfile de 4 gigabytes
  2. sudo chmod 600 /swapfile Asegure el swapfile restringiendo el acceso a la raíz
  3. sudo mkswap /swapfile Marque el archivo como un espacio de intercambio
  4. sudo swapon /swapfile Habilitar el swap
  5. echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab Persistir swapfile sobre reinicios (gracias por la sugerencia, ¡ bman !)