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系でエラーが出る場合はチェックしてみるのも一つの手でしょう。
以下のインターフェースは、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