`rails console`実行時の`listen error`とLinuxの`lsyncd`について

公開:2021/01/09
更新:2021/01/09
2 min読了の目安(約1900字TECH技術記事

事象

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には、inotifyAPIを使う lsyncd という仕組みがあります。

lsyncdinotifyAPIを使い、ファイルの変更を検知し、即座に同期する機能を提供します。rails consoleでは、listenというgemがファイルの変更検知・同期を行うために、lsyncdを利用しているようです。

このlsyncdinotifyはとても便利なのですが、同期ファイル数に上限が決められています。それがmax_user_watchesです。max_user_watchesは「1ユーザが監視できる最大ディレクトリ数」という意味です。デフォルトで8192(Ubuntu12 serverでは16384)に設定されています。

まとめ

以上を踏まえ、今回の事象と対策についてまとめると、以下のようになります。

  • rails console実行時に、lsyncdの同期ファイル上限数を超えるファイルを参照しようとしたので、エラーが発生
  • lsyncdの同期ファイル上限数を増やすことで、上限超過エラーを回避できた

終わりに

rails consoleのエラーから、以下の点を学ぶことができました。

  • ファイル同期数の上限エラーに対する解決方法
  • Linuxでのファイル監視・同期の仕組み(lsyncd, inotify)
  • listengemが行っていること

Linuxは様々な機能から成り立っており、とても奥が深いことを再認識することができました。今後も日々精進していきたいと思います。

参考文献