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 :
-
sudo fallocate -l 4G /swapfile
Crea un swapfile de 4 gigabytes -
sudo chmod 600 /swapfile
Asegure el swapfile restringiendo el acceso a la raíz -
sudo mkswap /swapfile
Marque el archivo como un espacio de intercambio -
sudo swapon /swapfile
Habilitar el swap -
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 !)