gulpなどのwatch系がENOSPCエラーで起動しない場合の対処。

対処

ファイルシステムイベントを監視するinotifyの、監視対象数上限を増やすと解決します。

echo fs.inotify.max_user_watches=582222 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

顛末

昨日まで機嫌よく働いていたgulpが今日になるとへそをまげていました。

ten@gulp$ gulp
[02:14:20] Requiring external module coffee-script/register
[02:14:20] Using gulpfile ~/haxe_project/block_breaker/gulp/gulpfile.coffee
[02:14:20] Starting 'default'...
events.js:141
      throw er; // Unhandled 'error' event
            ^
Error: watch ENOSPC

# 以下略

ENOSPC

ENOSPCというのはNo space left on deviceエラーを意味します。デバイスに空き領域がありませんということです。

しかしディスクスペースには余裕があります。

inotify

watchにおいてこのエラーが出る場合、ファイルシステムイベントを監視するinotifyの、監視対象数上限にひっかかったのが原因です。

デフォルトでは8192に設定されていますので、その数を増やすことにより解決します。

echo fs.inotify.max_user_watches=582222 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

なお、inotifyは他にも上限を設定できる項目があります。

watch系でエラーが出る場合はチェックしてみるのも一つの手でしょう。

Man page of INOTIFY

以下のインターフェースは、inotify で消費される カーネルメモリーの総量を制限するのに使用できる:

/proc/sys/fs/inotify/max_queued_events このファイルの値は、アプリケーションが inotify_init(2) を呼び出すときに使用され、対応する inotify インスタンスについて キューに入れられるイベントの数の上限を設定する。 この制限を超えたイベントは破棄されるが、 IN_Q_OVERFLOW イベントが常に生成される。 > /proc/sys/fs/inotify/max_user_instances 1 つの実ユーザー ID に対して生成できる inotify インスタンスの数の上限を指定する。 > /proc/sys/fs/inotify/max_user_watches 作成可能な監視対象の数の実 UID 単位の上限を指定する。

そんなに多くのファイルを監視してるの?

システム全体で言えばDropboxなどでも使用されているようなので、わりと簡単に上限を突破する感じがします。

参考

gruntjs - Grunt watch error - Waiting...Fatal error: watch ENOSPC - Stack Overflow