diff --git a/lib/Satan.js b/lib/Satan.js index 0ed8b995..e075bf1b 100644 --- a/lib/Satan.js +++ b/lib/Satan.js @@ -627,7 +627,6 @@ Satan.unlock = function(opts, cb) { if (require.main === module) { var pkg = require('../package.json'); - var God = require('./God.js'); process.title = 'PM2 v' + pkg.version + ': God Daemon'; @@ -639,18 +638,13 @@ if (require.main === module) { d.once('error', function(err) { console.error('[PM2] Error caught by domain:\n' + (err.stack || err)); + console.error('[PM2] Trying to update PM2...'); - process.once('uncaughtException', function() { - console.error('[PM2] Automatic `pm2 update` failed. Killing PM2 daemon and its processes...'); - process.emit('SIGTERM'); + require('child_process').spawn('node', [process.env['_'], 'update'], { + detached: true, + stdio: 'inherit' }); - God.dumpProcessList(function() { - require('child_process').spawn('node', [process.env['_'], 'update'], { - detached: true, - stdio: [0,1,2] - }); - }); }); d.run(function() { diff --git a/lib/Worker.js b/lib/Worker.js index 09aca67c..e7af11fc 100644 --- a/lib/Worker.js +++ b/lib/Worker.js @@ -2,7 +2,7 @@ var vizion = require('vizion'); var cst = require('../constants.js'); var async = require('async'); var debug = require('debug')('pm2:worker'); - +var domain = require('domain'); module.exports = function(God) { var timer = null; @@ -57,7 +57,6 @@ module.exports = function(God) { var versioningRefresh = function(proc_key, cb) { var proc = _getProcessById(proc_key.pm2_env.pm_id); - if (!(proc && proc.pm2_env && proc.pm2_env.vizion !== false && @@ -135,9 +134,23 @@ module.exports = function(God) { }); }; + var wrappedTasks = function() { + var d = domain.create(); + + d.once('error', function(err) { + console.error('[PM2][WORKER] Error caught by domain:\n' + (err.stack || err)); + God.Worker.is_running = false; + }); + + d.run(function() { + tasks(); + }); + }; + + God.Worker.start = function() { console.log('[PM2][WORKER] Started with refreshing interval: '+cst.WORKER_INTERVAL); - timer = setInterval(tasks, cst.WORKER_INTERVAL); + timer = setInterval(wrappedTasks, cst.WORKER_INTERVAL); }; God.Worker.stop = function() {