monitor 2.24 KB
var fs = require('fs'),
    path = require('path'),
    forever = require(path.resolve(__dirname, '..', 'lib', 'forever')),
    started;

//
// ### @function (file, pid)
// #### @file {string} Location of the pid file.
// #### @pid {number} pid to write to disk.
// Write the pidFile to disk for later use
//
function writePid(file, pid) {
  fs.writeFileSync(file, pid, 'utf8');
}

//
// ### @function start (options)
// #### @options {Object} Options for the `forever.Monitor` instance.
// Starts the child process and disconnects from the IPC channel.
//
function start(options) {
  var script = process.argv[2],
      monitor = new forever.Monitor(script, options);

  forever.logEvents(monitor);
  monitor.start();

  monitor.on('start', function () {
    //
    // This starts an nssocket server, which the forever CLI uses to
    // communicate with this monitor process after it's detached.
    // Without this, `forever list` won't show the process, even though it
    // would still be running in the background unaffected.
    //
    forever.startServer(monitor);

    //
    // Disconnect the IPC channel, letting this monitor's parent process know
    // that the child has started successfully.
    //
    process.disconnect();

    //
    // Write the pidFile to disk
    //
    writePid(options.pidFile, monitor.child.pid);
  });

  //
  // When the monitor restarts update the pid in the pidFile
  //
  monitor.on('restart', function () {
    writePid(options.pidFile, monitor.child.pid);
  });


  //
  // When the monitor stops or exits, remove the pid and log files
  //
  function cleanUp() {
    try {
      fs.unlinkSync(options.pidFile);
    }
    catch(e) {}
  }
  monitor.on('stop', cleanUp);
  monitor.on('exit', cleanUp);
}

//
// When we receive the first message from the parent process, start
// an instance of `forever.Monitor` with the options supplied.
//
process.on('message', function (data) {
  //
  // TODO: Find out if this data will ever get split into two message events.
  //
  var options = JSON.parse(data.toString());

  // inherits configuration from parent process if exists.
  options && options._loadedOptions && (forever.load(options._loadedOptions), delete options._loadedOptions);

  if (!started) {
    started = true;
    start(options);
  }
});