summaryrefslogtreecommitdiff
path: root/node_modules/forever/bin/monitor
blob: 2bd9fd9fe28afe126661aae8b21bf104b72798ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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());
  if (!started) {
    started = true;
    start(options);
  }
});