はじめに
Railsでコンソールを起動するとき、下記のエラーが発生したため、そのトラブルシュート記事です。
$bundle exec rails c
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.
エラーの内容は「ディレクトリの変更を監視できません」という意味です。エラーはListenというgemが出しています。解決方法はListenの公式サイトに記載されていましたのでこちらを参照にして解決しました。
公式サイト
https://github.com/guard/listen/blob/master/README.md
環境
- Ubuntu 20.4
- Rails 5.2.6
- Ruby 2.6
原因
Railsでコンソールを起動するときに、バックでListenというgemを利用しているようです。そして更にListenはLinuxのInotifyというツールを利用しています。
Inotifyとはファイルの変更を検知するツールです。Inotifyが検知するファイルのMAX数が上限に達したためにエラーが発生しました。
MAX数を増やすことでエラーは回避されました。
Inotifyについて詳しいサイト
https://qiita.com/TomonoriMikami/items/cae5d6d4cee8cd01f4b1
https://zenn.dev/ouvill/articles/inotify_limis
/etc/sysctl.conf について
Inotifyが検知するファイルのMAX数はこのファイルで設定します。デフォルトではこのファイルには何も設定されていません。ファイルの中身を参照すると、なんらかの記述はありまですが、すべてコメントになっています。
OS起動時に設定されている値が、/proc/sys/fs/inotify/max_user_watchesに反映されます。
/proc/sysは特殊なファイルシステムで、OS起動時にマウントされます。そして、シャットダウン時に削除されます。つまり、/proc/sys/fs/inotify/max_user_watchesを直接エディタで触っても、次回起動時にクリアされるため、/etc/sysctl.confを直接触る必要があります。設定されていなければmax_user_watchesの値はデフォルトで8192になります。
$ cat /proc/sys/fs/inotify/max_user_watches
8192
値が8192になっているということは、8192個分のファイルの変更が検知できるということです。8192 / 1024 = 8M なので、8192個分のファイルの変更を検知すると8Mのメモリが消費されます。MAX値は524288です。ちなみに524288 / 1024 = 512Mです。
解決方法
公式サイトにはつぎのように記載されています。
$sudo sh -c "echo fs.inotify.max_user_watches=524288 >> /etc/sysctl.conf"
$sudo sysctl -p
ググると次のコマンドで解決させている記事も多々ありました。やっていることは同じです。
$echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
$sudo sysctl -p
sysctl -pは、/etc/sysctl.confの内容を、OSを再起動することなく、/proc/sys/fs/inotify/max_user_watchesに即反映させることはできるコマンドです。
Inotifyの補足
Inotify Istanceを常駐させていて、ファイルが1つ操作されるたびに、Inotify Watchを1つを登録していきます。このInotify Watchが上限に達するとエラーとなります。max_user_watchesは自分の環境では8192がデフォルト値でしたが、OSのバージョンごとにデフォルト値が決められているわけではなく、搭載されているメモリ容量によって自動で計算されるようになっている模様です。
補足
上記のやり方で解決できなければ、公式サイトにこのような注意書きありますので、参考にしてください。
You may also need to pay attention to the values of max_queued_events and max_user_instances if Listen keeps on complaining.
参考サイト
https://qiita.com/yn-misaki/items/c850a07f7858437e4d26