diff --git a/lib/cli.js b/lib/cli.js index ab055b48..ee8111ff 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -2,6 +2,8 @@ var program = require('commander') var pkg = require('../package') var cliutil = require('./util/cliutil') +var procutil = require('./util/procutil') +var logger = require('./util/logger') program .version(pkg.version) @@ -261,45 +263,60 @@ program , String , 'tcp://127.0.0.1:7116') .action(function() { + var log = logger.createLogger('cli') var options = cliutil.lastArg(arguments) - , fork = require('child_process').fork // app triproxy - fork(__filename, [ - 'triproxy', 'app001' - , '--bind-pub', options.bindAppPub - , '--bind-dealer', options.bindAppDealer - , '--bind-pull', options.bindAppPull - ]) + procutil.fork(__filename, [ + 'triproxy', 'app001' + , '--bind-pub', options.bindAppPub + , '--bind-dealer', options.bindAppDealer + , '--bind-pull', options.bindAppPull + ]) + .catch(function(err) { + log.error('app triproxy died', err.stack) + }) // device triproxy - fork(__filename, [ - 'triproxy', 'dev001' - , '--bind-pub', options.bindDevPub - , '--bind-dealer', options.bindDevDealer - , '--bind-pull', options.bindDevPull - ]) + procutil.fork(__filename, [ + 'triproxy', 'dev001' + , '--bind-pub', options.bindDevPub + , '--bind-dealer', options.bindDevDealer + , '--bind-pull', options.bindDevPull + ]) + .catch(function(err) { + log.error('device triproxy died', err.stack) + }) // coordinator one - fork(__filename, [ - 'coordinator', 'coord001' - , '--connect-app-dealer', options.bindAppDealer - , '--connect-dev-dealer', options.bindDevDealer - ]) + procutil.fork(__filename, [ + 'coordinator', 'coord001' + , '--connect-app-dealer', options.bindAppDealer + , '--connect-dev-dealer', options.bindDevDealer + ]) + .catch(function(err) { + log.error('coordinator 001 died', err.stack) + }) // coordinator two - fork(__filename, [ - 'coordinator', 'coord002' - , '--connect-app-dealer', options.bindAppDealer - , '--connect-dev-dealer', options.bindDevDealer - ]) + procutil.fork(__filename, [ + 'coordinator', 'coord002' + , '--connect-app-dealer', options.bindAppDealer + , '--connect-dev-dealer', options.bindDevDealer + ]) + .catch(function(err) { + log.error('coordinator 002 died', err.stack) + }) // provider - fork(__filename, [ - 'provider' - , '--connect-sub', options.bindDevPub - , '--connect-push', options.bindDevPull - ].concat(cliutil.allUnknownArgs(arguments))) + procutil.fork(__filename, [ + 'provider' + , '--connect-sub', options.bindDevPub + , '--connect-push', options.bindDevPull + ].concat(cliutil.allUnknownArgs(arguments))) + .catch(function(err) { + log.error('provider died', err.stack) + }) }) program.parse(process.argv) diff --git a/lib/util/procutil.js b/lib/util/procutil.js new file mode 100644 index 00000000..d363aa48 --- /dev/null +++ b/lib/util/procutil.js @@ -0,0 +1,36 @@ +var util = require('util') +var cp = require('child_process') + +var Promise = require('bluebird') + +function ExitError(code) { + Error.call(this, util.format('Exit code "%d"', code)) + this.name = 'ExitError' + this.code = code + Error.captureStackTrace(this, ExitError) +} + +util.inherits(ExitError, Error) + +// Export +module.exports.ExitError = ExitError + +// Export +module.exports.fork = function() { + var args = arguments + + return new Promise(function(resolve, reject) { + var proc = cp.fork.apply(cp, args) + + proc.on('error', function(err) { + reject(err) + proc.kill() + }) + + proc.on('exit', function(code) { + if (code > 0) { + reject(new ExitError(code)) + } + }) + }) +}