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. (/home/username/workspace/electron/my-app/node_modules/chokidar/lib/nodefs-handler.js:477:19)
at FSWatcher. (/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
参考文献
このエラーの原因と解決策については、以下のドキュメントに詳しく書かれており大変助かりました。この記事の内容も、以下の内容を元にしています。
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=524288
をtee
コマンドに渡してsysctl.conf
に書き込んでいます。そして2行目ではロードしています。
なお、max_user_watches
以外にも、max_user_watches
以外にも、max_queued_events
やmax_user_instances
についてエラーがでる場合もあるそうなのでこちらも必要に応じて増加させる必要がある場合もありそうです。
まとめ
もし似たようなエラーに遭遇している方がいれば参考になれば嬉しいです。
関連記事
- 公開日:2020/02/16 更新日:2020/02/16
圧縮、暗号化、リモート対応の差分バックアップを作成できる「Borg Backup」の使い方
圧縮、暗号化に対応し差分バックアップを作成できるソフトウェアである「Borg Backup」をUbuntuにインストールして使ってみたのでその手順をまとめます。「Borg Backup」はLinux、macOSに対応しています。
- 公開日:2020/02/14 更新日:2020/02/14
自分専用の後で読むサービスを構築できる「Wallabag」をUbuntu + Nginxで構築する手順
後で読むサービスのPocketにかなり近く、機能豊富なオープンソースのWallabagをUbuntuにインストールしたのでその手順をまとめます。
- 公開日:2020/02/12 更新日:2020/02/12
ファイル単位で暗号化して保存できるCryptomatorをインストールして使う手順
Cryptomatorは、ファイル単位での暗号化が可能なソフトウェアです。この記事では、UbuntuにCryptomatorをインストールする手順と使い方をまとめます。
- 公開日:2020/01/22 更新日:2020/01/22
WireGuardでVPNサーバーを構築してスマホやPCから接続する手順
WireGuardはOpenVPNよりもシンプルで高速、より安全なVPNとして開発が進められており、OpenVPNに代わるVPNとして期待されています。この記事ではWireGuardを使ってVPNサーバーを構築し、そのVPNサーバーにUbuntuやiPhoneから実際に接続してみるまでの手順をまとめます。
- 公開日:2020/01/17 更新日:2020/01/17
ディレクトリ表示や移動をインタラクティブに実行できるコマンドツール「Broot」
Linuxで端末を使っている時にディレクトリ構造をざっくり確認したり各ディレクトリにどのようなファイルが入っているかを確認したりしたい場合があると思います。Brootはディレクトリ構造を表示しつつさらにそこから各ディレクトリに移動したりファイルを検索したりできるコマンドラインツールです。