grunt-bg-shell

Better shell commands for grunt. Background/parallel run

grunt-bg-shell

Improve your workflow by running commands in the background and in parallel using Grunt.

Note: This plugin requires Grunt ~0.4.0

If you haven't used Grunt before, be sure to check out the Getting Started guide, as it explains how to create a Gruntfile as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:

npm install grunt-bg-shell --save-dev

Then add the task to your Gruntfile.js with this line:

grunt.loadNpmTasks('grunt-bg-shell');

For example, say you want to run your node server and also compile coffeescript and sass/scss files all in the same terminal. You could acheive that with the following config:

module.exports = function (grunt) {
  grunt.initConfig({
    bgShell: {
      _defaults: {
        bg: true
      },
      
      watchCompass: {
        cmd: 'compass watch'
      },
      watchCoffee: {
        cmd: 'coffee --watch --output lib/ src/'
      },
      runNode: {
        cmd: 'node server.js',
        bg: false
      }
    }
  });
  grunt.registerTask('default', ['bgShell:watchCompass','bgShell:watchCoffee','bgShell:runNode']);
};
bgShell: {
  lsTasks: {
    cmd: 'ls -la', // or function(){return 'ls -la'} 
    execOpts: {
      cwd: './tasks'
    },
    stdout: true,
    stderr: true,
    bg: false,
    fail: false,
    donefunction(){}
  }     
}
  • cmd: command to execute or function(){} that returns a command to execute
  • execOpts: options for child_process.exec. If execOpts.maxBuffer set to false, 0, NaN or Infinite it won't buffer stdout and stderr for done callback
  • stdout: true, false or function(out){}
  • stderr: true, false or function(err){}
  • bg: background execution
  • fail: fail grunt on error
  • done: callback after execution function(err, stdout, stderr){}
bgShell: {
  _defaults: {
    execOpts: {},
    stdout: true,
    stderr: true,
    bg: false,
    fail: false,
    donefunction (errstdoutstderr) {
    }
  },
}

If you get

Error: stdout maxBuffer exceeded

You should set execOpts.maxBuffer to false. But you won't get stdout and strerr in done callback

Example:

bgShell: {
  lsTasks: {
    cmd: 'ls -la',
    execOpts: {
      maxBuffer: false
    },
    stdoutfunction(chunk){
      // process your stdout chunk 
    },
    stderrfunction(chunk){
      // process your stderr chunk 
    },
    donefunction (errstdoutstderr) {
      // stdout === null 
      // stderr === null 
    }
  }
}