Source: apc-static/task/worker/watch_for_task.js

/**
 * Watch files to execute task.
 * @function task.worker.watchFilesForTask
 * @param {object} config - Work configuration.
 * @param {string} config.task - Task name to execute.
 * @param {number} [config.timeout=50000] - Timeout milliseconds.
 * @param {string|string[]} config.dir - Directories to watch. Glob.
 * @param {function} callback - Callback when done.
 * @author Taka Okunishi
 *
 */
var fs = require('fs'),
    path = require('path'),
    debug = require('./_debug'),
    file = require('../../lib/file'),
    expandGlob = file.expandGlob,
    filterDirectory = file.filterDirectory,
    format = require('util').format;

exports = module.exports = function (config, callback) {
    var taskName = config.task,
        delay = 500,
        timeout = config.timeout || 8 * 1000;
    expandGlob(config.dir, function (err, filenames) {
        if (err) {
            callback(err);
            return;
        }
        filterDirectory(filenames, function (err, dirnames) {
            if (err) {
                callback(err);
                return;
            }
            dirnames.forEach(function (dirname) {
                fs.watch(dirname, function (ev, filename) {
                    debug('File changed %s', filename);
                    try {
                        exports._executeTask(taskName, delay, timeout, function (e) {
                            console.error(e.stack || e);
                        });
                    } catch (e) {
                        console.error(e.stack || e);
                    }
                });
                debug('Start watch:%s', dirname);
            });
        });
    });
    callback();
};


exports._executeTask = function (taskName, delay, timeout, errCallback) {
    var apeman = require('apeman');
    var timer = exports._timers[taskName];
    if (timer) clearTimeout(timer);
    exports._timers[taskName] = setTimeout(function () {
        var errorTimer = setTimeout(function () {
            var msg = format('Task "%s" took to too long. %s ms passed.', taskName, timeout);
            errCallback(msg)
        }, timeout);

        apeman.task(taskName, {}, function () {
            clearTimeout(errorTimer);
        });
    }, delay);
};
exports._timers = {};