diff --git a/lib/cluster.coffee b/lib/cluster.coffee index 9203177..2dcd6ad 100644 --- a/lib/cluster.coffee +++ b/lib/cluster.coffee @@ -24,10 +24,11 @@ cluster.on('listening', (worker, address) -> util.log("Worker #{worker.process.pid} listening to #{address.address}:#{address.port}") ) -cluster.on('exit', (worker, code, signal) -> - util.log("Worker #{worker.process.pid} died (#{worker.process.exitCode})") +restartWorker = (worker, code, signal) -> + util.log("Worker #{worker.process.pid} died (#{worker.process.exitCode}) #{signal}") cluster.fork() -) + +cluster.on('exit', restartWorker) start = (service) -> @@ -43,4 +44,15 @@ start = (service) -> cluster.fork() +process.on('SIGINT', () -> + cluster.removeListener('exit', restartWorker) +) + +process.on('SIGTERM', () -> + cluster.removeListener('exit', restartWorker) + for id of cluster.workers + cluster.workers[id].kill() +) + + exports.start = start diff --git a/lib/server.coffee b/lib/server.coffee index 7d308f0..183356e 100644 --- a/lib/server.coffee +++ b/lib/server.coffee @@ -20,6 +20,8 @@ util = require 'util' cluster = require 'cluster' config = require './config' db = require './db' +extensions = require './extensions' + service = config.argv[0] if not service? @@ -34,23 +36,25 @@ onConnection = require("./#{service}").onConnection server = null +exit = () -> + setTimeout(() -> + process.exit(1) + , 30000).unref() + + cluster.worker?.disconnect() + server.close(() -> + db.disconnect() + extensions.killAll() + ) + + listener = (httpRequest, httpResponse) -> d = domain.create() d.on('error', (err) -> util.error("#{new Date().toISOString()} - #{err.stack}\n") try - killTimer = setTimeout(() -> - process.exit(1) - , 30000) - - killTimer.unref() - - cluster.worker?.disconnect() - server.close(() -> - db.disconnect() - ) - + exit() httpResponse.writeHead(500, {'Connection' : 'close'}) httpResponse.end("#{err.name}: #{err.message}") catch err2 @@ -85,3 +89,7 @@ db.connect((err) -> throw err if err server.listen(port, networkInterface) ) + + +process.on('SIGINT', exit) +process.on('SIGTERM', exit)