Linux

LinuxでSystem limit for number of file watchers reachedが出る場合の原因と対策


Photo by Sai Kiran Anagani on Unsplash

はじめに

Electron + Vue.jsによるデスクトップアプリ開発のためにVue CLI Plugin Electron Builderというプラグインを使用していましたが、アプリ起動時にSystem limit for number of file watchers reachedというエラーが表示されました。調べてみると、このエラーは特にVue CLI Plugin Electron Buildeを使った場合に限ったものではなく、Visual Studio CodeやNode.jsを使用している場合など、Linux上でファイル監視が動作するような場合には起こりうるエラーのようです。この記事では、この原因と解決策についてまとめます。

エラーの内容

私がこのエラーに遭遇したのは、Electron + Vue.jsでアプリを起動した時です。以下のようなエラーが表示されました。

$ npm run electron:serve

> my-app@0.1.0 electron:serve /home/username/workspace/electron/my-app
> vue-cli-service electron:serve

 INFO  Starting development server...
 10% building 2/2 modules 0 activeevents.js:174                              
      throw er; // Unhandled 'error' event
      ^

Error: ENOSPC: System limit for number of file watchers reached, watch '/home/username/workspace/electron/my-app/public'
    at FSWatcher.start (internal/fs/watchers.js:165:26)
    at Object.watch (fs.js:1258:11)
    at createFsWatchInstance (/home/username/workspace/electron/my-app/node_modules/chokidar/lib/nodefs-handler.js:38:15)
    at setFsWatchListener (/home/username/workspace/electron/my-app/node_modules/chokidar/lib/nodefs-handler.js:81:15)
    at FSWatcher.NodeFsHandler._watchWithNodeFs (/home/username/workspace/electron/my-app/node_modules/chokidar/lib/nodefs-handler.js:233:14)
    at FSWatcher.NodeFsHandler._handleDir (/home/username/workspace/electron/my-app/node_modules/chokidar/lib/nodefs-handler.js:429:19)
    at FSWatcher.<anonymous> (/home/username/workspace/electron/my-app/node_modules/chokidar/lib/nodefs-handler.js:477:19)
    at FSWatcher.<anonymous> (/home/username/workspace/electron/my-app/node_modules/chokidar/lib/nodefs-handler.js:482:16)
    at FSReqWrap.oncomplete (fs.js:154:5)
Emitted 'error' event at:
    at FSWatcher._handleError (/home/username/workspace/electron/my-app/node_modules/chokidar/index.js:260:10)
    at createFsWatchInstance (/home/username/workspace/electron/my-app/node_modules/chokidar/lib/nodefs-handler.js:40:5)
    at setFsWatchListener (/home/username/workspace/electron/my-app/node_modules/chokidar/lib/nodefs-handler.js:81:15)
    [... lines matching original stack trace ...]
    at FSReqWrap.oncomplete (fs.js:154:5)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! my-app@0.1.0 electron:serve: `vue-cli-service electron:serve`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the my-app@0.1.0 electron:serve script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/username/.npm/_logs/2019-06-05T06_41_39_880Z-debug.log

私が遭遇したのはElectron + Vue.jsでのアプリ開発をしている時でしたが、他の場合でも起こりうるようなのでこのエラーの原因と解決策をまとめます。

前提と環境

以下の通りです。

  • OS : Ubuntu 18.04
  • Node.js : 10.16.0
  • Electron : 5.0.0
  • Vue CLI : 3.8.2

参考文献

このエラーの原因と解決策については、以下のドキュメントに詳しく書かれており大変助かりました。この記事の内容も、以下の内容を元にしています。

Increasing the amount of inotify watchers

Listen uses inotify by default on Linux to monitor directories for changes. It’s not uncommon to encounter a system limit on the number of files you can monitor. For example, Ubuntu Lucid’s (64bit) inotify limit is set to 8192.

エラーの原因

エラーの原因は、エラー内容の通り、監視できるファイル数が上限に達していることが原因です。Linuxでは、ファイル監視のためにinotifyというAPIが用意されており、これを使用することで個々のファイルやディレクトリを監視できます。ただ、inotifyで監視できるファイル数はデフォルトで8192に上限が設定されています。そしてこの上限を超えると、System limit for number of file watchers reachedというエラーが出ます。そしてinotifyを内部的に使用しているライブラリは多く、色々な場合に起こりえます。
この上限値を一時的、または永続的に増加させることでこのエラーを回避できます。

現在のinotifyの上限値を調べる

自身のLinuxでinotifyの上限値を調べるには、以下のコマンドを実行します。私の環境では、デフォルトの8192が確かに表示されました。

$ cat /proc/sys/fs/inotify/max_user_watches
8192

inotifyの上限値を一時的に増加させる

inotifyが監視できるファイル数を一時的に増加させるには、以下のコマンドを実行します。以下では、524288に設定しています。

$ sudo sysctl fs.inotify.max_user_watches=524288
[sudo] username のパスワード: 
fs.inotify.max_user_watches = 524288

これで再度上限値を調べてみてると、以下のようにちゃんと設定されていることを確認できます。

$ cat /proc/sys/fs/inotify/max_user_watches
524288

inotifyの上限値を永続的に増加させる

一時的ではなく永続化したい場合は以下のコマンドを実行します。

$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
$ sudo sysctl -p

1行目でfs.inotify.max_user_watches=524288teeコマンドに渡してsysctl.confに書き込んでいます。そして2行目ではロードしています。

なお、max_user_watches以外にも、max_user_watches以外にも、max_queued_eventsmax_user_instancesについてエラーがでる場合もあるそうなのでこちらも必要に応じて増加させる必要がある場合もありそうです。

まとめ

もし似たようなエラーに遭遇している方がいれば参考になれば嬉しいです。

SPONSORED LINK

コメントを残す

メールアドレスが公開されることはありません。