Auto-regeneration never stop and exhausts CPU resource!

昨日、Gemfileを見直していたら、古くなっているgemがいくつかあったので、アップデートしてみたら、regeneration: 1 files changedというメッセージが延々と出続けて、CPUの使用率が100%に張り付いてしまう、という現象に遭遇してしまった。結論からいうと、directory_watcher 1.5.1に加えられた変更が良くなかったらしく、1.4.1に戻したら大丈夫だった。

So, how can I fix it?

Jekyll's “--auto” doesn't work? - Stack Overflow

Stack Overflowに、Jekyllを使っている人の質問が上がっていた。解決方法はdirectory_watcherを1.4.1に戻す事、と書いてあった。1.5.1では、全面的にリファクタリングされているようで、diffを見ただけだと、問題となったコードがどこなのか、よく分からなかった。

sudo gem uninstall directory_watcher && sudo gem install directory_watcher -v 1.4.1

Gemfileを使っている場合は、明示的にdirectory_watcherのバージョンを指定して、bundle updateすればいいはず。

Gemfile
gem "directory_watcher", "~> 1.4.1"

The next Octopress and Jekyll version will come

最初に見つかった解決方法はJekyllを1.0.0 beta3に上げる事(rake watch/generate goes wrong with jekyll --auto/serverJekyll auto regeneration loop never stops)だったが、このバージョンでは、jekyll --autoが無くなっており、Otopress masterが対応していないため、Octopress側も2.1にする必要がある(masterではなく、2.1が開発版なのか)。さらに、_config.ymlで定義していたサイトの設定も別の設定方法に変更されているようだった。Octopress 2.1へのマイグレーションは、まだドキュメントになさそうだったので、さらにググっていたら、上記の通り、directory_watcherのバージョン戻せばいいんじゃね?というオチだった。

Octopress 2.1ではguardというgemを使うようになるらしい。READMEには、

Guard is a command line tool to easily handle events on file system modifications.

とある。さらに、

You can configure Guard to make use of the following system notification libraries

と書いてあるので、ファイルシステムの変更を監視して、Growlとか通知センターに通知を送れるようになるのだろうか。そうであれば、rake previewしてるときに、通知されるようになってくれるとすごくうれしい。