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エラーをキャッチするにはどうすればよいですか?
ありがとう!
私は同じ問題を抱えていましたが、判明したように、私のシステムにはスワップ空間が有効になっていません。コマンド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を実行している場合は、次の手順に従うことができます スワップファイルの追加に関する指示 :
Sudo fallocate -l 4G /swapfile
4ギガバイトのスワップファイルを作成Sudo chmod 600 /swapfile
ルートへのアクセスを制限してスワップファイルを保護しますSudo mkswap /swapfile
ファイルをスワップスペースとしてマークするSudo swapon /swapfile
スワップを有効にするecho "/swapfile none swap sw 0 0" | Sudo tee -a /etc/fstab
再起動後もスワップファイルを保持します(ヒントをありがとう、 bman !)AWS Lambdaでこの問題に遭遇したことがある場合は、関数に割り当てるメモリを増やすことを検討する必要があります。
次のコマンドを使用して、ノードが使用するメモリの量を変更してみることができます: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に低く設定してみてください。
私は同じ問題を抱えていて、try/catchで修正しました:
try {
zbarimg = process.spawn('zbarimg', [photo, '-q']);
} catch (err) {
console.log(err);
}
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... });