Luis Valdez
Luis Valdez

Reputation: 2429

Grunt server error, EMFILE

Whenever I do "grunt server" it automatically gives me this error:

Running "watch" task
Waiting...
Warning: EMFILE, too many open files

and next this:

(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.

This usual fix I've seen on the web is changing the name as shown bellow:

grunt.registerTask('uglify', ['jshint', 'uglify']);

grunt.registerTask('myuglify', ['jshint', 'uglify']);

Although my problem cannot be fixed with such method because I'm not using the same name as the task.

My gruntfile.js:

module.exports = function(grunt){
grunt.initConfig({
  sass: {
    dist: {
      files: {
        'styles/css/main.css': 'styles/sass/main.scss'
      }
    }
  }

  ,watch: {
    options:{livereload:true},
    sass:{
        files:'styles/sass/*.scss',
        tasks:'sass'
        }
    },

    express:{
        all:{
            options:{
                port:9000,
                hostname:'localhost',
                bases:'.',
                livereload:true

            }

        }
    }
});

grunt.loadNpmTasks('grunt-contrib-sass');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-express');
grunt.registerTask('default', ['sass'])
grunt.registerTask('server',['express','watch'])

}

Any idea?

Upvotes: 2

Views: 2264

Answers (2)

James Wright
James Wright

Reputation: 3010

I encountered this time-wasting error today, and the solution on the GitHub repository did not work for me. After searching for this issue in relation to the process.nextTick deprecation warning, I came to the conclusion that running a task dependent on a watched file/glob is a potential cause.

Here's the Gruntfile for my website:

module.exports = function (grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        watch: {
            dev: {
                files: ['**/*.js', 'public/stylesheets/**/*.scss'],
                tasks: ['express:dev'],
                options: {
                    spawn: false
                }
            }
        },
        express: {
            dev: {
                options: {
                    script: 'server.js',
                    node_env: 'development'
                }
            }
        }
    });

    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-express-server');

    grunt.registerTask('default', ['express:dev', 'watch']);
};

I resolved the issue by removing js files from my watch task, which restarts Express. The below configuration of the aforementioned task works fine for me:

watch: {
    dev: {
        files: ['public/stylesheets/**/*.scss'],
        tasks: ['express:dev'],
        options: {
            spawn: false
        }
    }
},

This SO answer provides a similar fix. Interestingly, I've never encountered this problem on my Ubuntu machine; it happened on my MacBook today when I cloned my repository.

Upvotes: 2

user2426598
user2426598

Reputation: 314

worked for me when i typed

sudo grunt serve

possibly another solution. just increase increase read file limit. https://github.com/gruntjs/grunt-contrib-watch#how-do-i-fix-the-error-emfile-too-many-opened-files

ulimit -n 10480

Upvotes: 0

Related Questions