`rails console`実行時の`listen error`とLinuxの`lsyncd`について
事象
Linux環境でrails console
を実行したら以下のエラーが出るようになりました。
FATAL: Listen error: unable to monitor directories for changes.
Visit https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers for info on how to fix this.
エラー文に記載のあるURLにアクセスすると、以下のコマンドが記載されていました。
$ sudo sh -c "echo fs.inotify.max_user_watches=524288 >> /etc/sysctl.conf"
$ sudo sysctl -p
この通りのコマンドを入力すると、上述のエラーが解消されました。
原因
今回対策で行ったコマンドは inotifyのmax_user_watchesの数を変更 です。
ただ、このinotifyとはなんでしょうか?調べてみるとinotify
はLinuxのAPIの1つでファイルイベントを監視する役割だそうです。ファイルイベントの具体例としてはファイルやディレクトリの作成、削除、更新、またパーミッション変更などが挙げられます。つまり、inotifyはファイルの変更を検知ができるということですね。
さらにLinuxには、inotify
APIを使う lsyncd という仕組みがあります。
lsyncd
はinotify
APIを使い、ファイルの変更を検知し、即座に同期する機能を提供します。rails console
では、listenというgemがファイルの変更検知・同期を行うために、lsyncd
を利用しているようです。
このlsyncd
とinotify
はとても便利なのですが、同期ファイル数に上限が決められています。それがmax_user_watchesです。max_user_watches
は「1ユーザが監視できる最大ディレクトリ数」という意味です。デフォルトで8192(Ubuntu12 serverでは16384)に設定されています。
まとめ
以上を踏まえ、今回の事象と対策についてまとめると、以下のようになります。
-
rails console
実行時に、lsyncd
の同期ファイル上限数を超えるファイルを参照しようとしたので、エラーが発生 -
lsyncd
の同期ファイル上限数を増やすことで、上限超過エラーを回避できた
終わりに
rails console
のエラーから、以下の点を学ぶことができました。
- ファイル同期数の上限エラーに対する解決方法
- Linuxでのファイル監視・同期の仕組み(
lsyncd
,inotify
) -
listen
gemが行っていること
Linuxは様々な機能から成り立っており、とても奥が深いことを再認識することができました。今後も日々精進していきたいと思います。