私のアプローチはthis oneから来ており、基本的に@Ege Özcanが言ったことを行います。
唯一の追加は、ノードが端末から信号を取得していなかったため、サーバーをオフにするルートを設定したことです ('SIGTERM'
および'SIGINT'
)。
さて、ノードは実行時に端末からシグナルを取得していnode whatever.js
ましたが、そのタスクをスクリプト ( 'start'
package.json のスクリプト -->npm start
など) に委任すると、 によってオフにできなかったCtrl+C
ため、このアプローチはうまくいきました。
私はCygwinの下にいることに注意してください。これは、ターミナルを閉じて再度開くことを意味する前に、サーバーを強制終了しました。
また、ルーティングにエクスプレスを使用していることにも注意してください。
var http=require('http');
var express= require('express');
var app= express();
app.get('/', function (req, res) {
res.send('I am alive but if you want to kill me just go to <a href="/exit">/exit</a>');
});
app.get('/exit', killserver);
var server =http.createServer(app).listen(3000, function(){
console.log('Express server listening on port 3000');
/*console.log(process);*/
});
// Maintain a hash of all connected sockets
var sockets = {}, nextSocketId = 0;
server.on('connection', function (socket) {
// Add a newly connected socket
var socketId = nextSocketId++;
sockets[socketId] = socket;
console.log('socket', socketId, 'opened');
// Remove the socket when it closes
socket.on('close', function () {
console.log('socket', socketId, 'closed');
delete sockets[socketId];
});
// Extend socket lifetime for demo purposes
socket.setTimeout(4000);
});
// close the server and destroy all the open sockets
function killserver() {
console.log("U killed me but I'll take my revenge soon!!");
// Close the server
server.close(function () { console.log('Server closed!'); });
// Destroy all open sockets
for (var socketId in sockets) {
console.log('socket', socketId, 'destroyed');
sockets[socketId].destroy();
}
};