2012-01-19 9 views
18

वर्तमान में, एक साइड प्रोजेक्ट के लिए मेरा प्रोड वातावरण एक गिट रेपो है, जहां मैं कुछ कोड खींचता हूं, मैन्युअल रूप से Ctrl-C के साथ सर्वर को मारता हूं, और इसे मैन्युअल रूप से पुनरारंभ करता हूं।एक नोडजेएस सर्वर को गर्वपूर्वक कैसे पुनरारंभ करें?

मुझे एहसास है कि इसमें बहुत सारी चीज़ें गलत हैं। उदाहरण के लिए, क्या होगा यदि कोई उपयोगकर्ता अभी भी कुछ महत्वपूर्ण करने के बीच में है और प्रक्रिया संवेदनशील डेटा को कम कर रही है, और मैंने इसे अभी मार दिया है ?!

जब मैंने नोड v0.4.x का उपयोग किया तो वहां एक अच्छा क्लस्टर मॉड्यूल था जो सर्वर को एक शांत स्थिति में होने पर सर्वर को पुन: प्रारंभ कर सकता था। V0.6.x में क्लस्टर मॉड्यूल नोड में बनाया गया है, लेकिन यह वास्तव में, वास्तव में बेयर है, और इसमें सुंदर पुनरारंभ क्षमता नहीं है।

कोई भी जानता है कि मैं v0.6.x में एक नोडजे सर्वर को कैसे पुन: प्रारंभ कर सकता हूं?

उत्तर

2

Forever नामक एक मॉड्यूल है।

जो प्रक्रिया को सावधानीपूर्वक पुनरारंभ कर सकता है। मुझे लगता है कि आप किसी भी तरह क्लस्टर (प्रत्येक कोर पर एक) के साथ कई उदाहरण चला सकते हैं और उन्हें मॉनिटर/पुनरारंभ करने के लिए हमेशा के लिए उपयोग कर सकते हैं।

यह एक विकल्प है जो मैंने पाया; मैं सुझावों के लिए खुला हूँ!

16

आप नोड कोड में POSIX सिग्नल को संभाल सकते हैं।

उदाहरण कोड में देखें, कि (उदाहरण के लिए Ctrl-C) SIGINT संभाल लेंगे सभी क्लस्टर श्रमिकों के लिए एक बंद संकेत के रूप में, और SIGUSR2 सिर्फ सभी मजदूरों को पुनः आरंभ करेगा

तो, kill -SIGUSR2 PID, जहां पीआईडी ​​नोड मालिक है जारी करने पीआईडी ​​सभी क्लस्टर

module.exports = function(app) { 
    var cluster = require('cluster'); 
    var numCPUs = require('os').cpus().length; 
    var workerList = new Array(); 
    var sigkill = false; 

    if (cluster.isMaster) { 
     for (var i = 0; i < numCPUs; i++) { 
      var env = process.env; 
      var worker = cluster.fork(env); 
      workerList.push(worker); 
     } 

     process.on('SIGUSR2',function(){ 
      console.log("Received SIGUSR2 from system"); 
      console.log("There are " + workerList.length + " workers running"); 
      workerList.forEach(function(worker){ 
       console.log("Sending STOP message to worker PID=" + worker.pid); 
       worker.send({cmd: "stop"}); 
      }); 
     }); 

     process.on('SIGINT',function(){ 
      sigint = true; 
      process.exit(); 
     }); 

     cluster.on('death', function(worker) { 
      if (sigkill) { 
       logger.warn("SIGKINT received - not respawning workers"); 
       return; 
      } 
      var newWorker = cluster.fork(); 
      console.log('Worker ' + worker.pid + ' died and it will be re-spawned'); 

      removeWorkerFromListByPID(worker.pid); 
      workerList.push(newWorker); 
     }); 
    } else { 
     process.on('message', function(msg) { 
      if (msg.cmd && msg.cmd == 'stop') { 
       console.log("Received STOP signal from master"); 
       app.close(); 
       process.exit(); 
      } 
     }); 
     app.listen(3000); 
    } 

    function removeWorkerFromListByPID(pid) { 
     var counter = -1; 
     workerList.forEach(function(worker){ 
      ++counter; 
      if (worker.pid === pid) { 
       workerList.splice(counter, 1); 
      } 
     }); 
    } 
} 
+0

क्या 'SIGUSR2' हैंडलर को अभी प्रक्रिया को पुनरारंभ करने के लिए कुछ करने की आवश्यकता नहीं है? –

+0

ओह, मुझे लगता है ... मुझे लगता है कि 'मौत' घटना अब नोड v0.10 में 'बाहर निकलने' है? –

+0

एक और सवाल ... यह सर्वर को गर्व से पुनरारंभ करता है, लेकिन यह सर्वर कोड को फिर से लोड नहीं करता है, सही? यह बाहरी निगरानी प्रक्रिया का कुछ प्रकार लेगा? –

1

वहाँ भी PM2 नाम के एक मॉड्यूल है पुनः आरंभ करेगा। इसमें क्लस्टर में सभी प्रक्रियाओं को रोकने की क्षमता है।

+0

-1; मैंने पीएम 2 की "खूबसूरत" रीलोड क्षमता की कोशिश की और जहां तक ​​मैं इसे बता सकता हूं [बस सादा काम नहीं करता] [https://github.com/Unitech/pm2/issues/3078) अभी। मैं वादा नहीं कर सकता कि यहां के किसी भी अन्य उत्तर बेहतर काम करते हैं, लेकिन मुझे यकीन है कि यह एक निराशाजनक और समय बर्बाद करने वाला मृत अंत है। –