web-dev-qa-db-ja.com

Node.jsは、スポーン後にスローされたENOMEMエラーをキャッチします

spawn を使用すると、ENOMEM(メモリ不足)errnoExceptionがスローされるため、Node.jsスクリプトがクラッシュします。

エラー:

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) { ... }); 

完全なソースコード 使用可能

スクリプトのクラッシュを防ぐためにできることはありますか?スローされたENOMEMエラーをキャッチするにはどうすればよいですか?

ありがとう!

69
tobi

私は同じ問題を抱えていましたが、判明したように、私のシステムにはスワップ空間が有効になっていません。コマンド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

一番下の行を見ると、合計0バイトのスワップメモリ​​があることがわかります。良くない。 Nodeはかなりメモリを空けることができ、メモリが不足したときにスワップスペースが利用できない場合、エラーは必ず発生します。

スワップファイルを追加する方法はオペレーティングシステムとディストリビューションによって異なりますが、私のようにUbuntuを実行している場合は、次の手順に従うことができます スワップファイルの追加に関する指示

  1. Sudo fallocate -l 4G /swapfile 4ギガバイトのスワップファイルを作成
  2. Sudo chmod 600 /swapfileルートへのアクセスを制限してスワップファイルを保護します
  3. Sudo mkswap /swapfileファイルをスワップスペースとしてマークする
  4. Sudo swapon /swapfileスワップを有効にする
  5. echo "/swapfile none swap sw 0 0" | Sudo tee -a /etc/fstab再起動後もスワップファイルを保持します(ヒントをありがとう、 bman !)
168
Kaivosukeltaja

AWS Lambdaでこの問題に遭遇したことがある場合は、関数に割り当てるメモリを増やすことを検討する必要があります。

1
James Shapiro

次のコマンドを使用して、ノードが使用するメモリの量を変更してみることができます:node ----max-old-space-size=1024 yourscript.js

--max-old-space-size = 1024は、1ギガのメモリを割り当てます。

デフォルトでは、ノードは512 mbのRAMを使用しますが、プラットフォームによっては、必要に応じてガベージコレクションが作動するように、多少の割り当てが必要になる場合があります。

プラットフォームで使用可能なRAMが500 MB未満の場合は、メモリ使用量を--max-old-space-size = 256に低く設定してみてください。

1
Deemoe

私は同じ問題を抱えていて、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
Nodarius