Handle SIGINT and SIGTERM to exit gracefully
This commit is contained in:
1 parent
9f85ead558
commit
34de9c7e7d
2 files changed
+34
-14
No files matched your search
+15
-3
@@ -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
|
||||
+19
-11
@@ -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)
|
||||
Reference in new issue
Block a user