नोड में 'Windows' ('SIGINT') के समतुल्य है।


84

मैं यहाँ मार्गदर्शन का अनुसरण कर रहा हूँ ( SIGINTघटनाओं के लिए सुन रहा हूँ ) Ctrl+ Cया सर्वर शटडाउन के जवाब में अपने विंडोज-8-होस्टेड नोड.जेएस एप्लिकेशन को शालीनतापूर्वक बंद करने के लिए।

लेकिन विंडोज नहीं है SIGINT। मैंने भी कोशिश की process.on('exit'), लेकिन कुछ भी करने में देर लगती है।

विंडोज पर, यह कोड मुझे देता है: त्रुटि: ऐसा कोई मॉड्यूल नहीं

process.on( 'SIGINT', function() {
  console.log( "\ngracefully shutting down from  SIGINT (Crtl-C)" )
  // wish this worked on Windows
  process.exit( )
})

विंडोज पर, यह कोड चलता है, लेकिन कुछ भी सुंदर करने के लिए बहुत देर हो चुकी है :

process.on( 'exit', function() {
  console.log( "never see this log message" )
})

क्या SIGINTविंडोज पर एक बराबर घटना है?


यह समस्या आज मेरे लिए अनियमित रूप से उत्पन्न हुई है और मुझे लगता है कि इसका रीडलाइन मॉड्यूल के साथ कुछ करना है। मैं कोई परीक्षण नहीं कर सका, लेकिन जब से मैंने इस मॉड्यूल को जोड़ा मुझे समस्या होने लगी।
Sv443

जवाबों:


148

आपको रीडलाइन मॉड्यूल का उपयोग करना है और एक SIGINT इवेंट के लिए सुनना है:

http://nodejs.org/api/readline.html#readline_event_sigint

if (process.platform === "win32") {
  var rl = require("readline").createInterface({
    input: process.stdin,
    output: process.stdout
  });

  rl.on("SIGINT", function () {
    process.emit("SIGINT");
  });
}

process.on("SIGINT", function () {
  //graceful shutdown
  process.exit();
});

सबसे उत्कृष्ट अद्यतन, धन्यवाद! इसे पिछले उत्तर (कीपर के लिए सुनो) के रूप में सेट करना अब काम नहीं करता है।
पापड़ॉग

44
यह मज़ाकीय है। यह नोड कोर द्वारा संभाला क्यों नहीं है?
बालुपटन

3
क्योंकि जब आप सुनते हैं तो प्रक्रिया तब तक पूरी नहीं होती जब तक आप स्पष्ट रूप से एक संकेत संकेत नहीं भेजते।
गेब्रियल लामास

2
इसलिए, आपको माता-पिता से बच्चे को एक यादृच्छिक संदेश भेजने की आवश्यकता है, उदाहरण के लिए: "SIGINT"।
गेब्रियल ललमास

8
ऐसा लगता है कि यह कुछ समय पहले हल हो गया था: github.com/nodejs/node-v0.x-archive/issues/5054
सिमोनसिमिटी

23

मुझे यकीन नहीं है कि कब, लेकिन नोड 8.x और विंडोज 10 पर मूल प्रश्न कोड बस काम करता है।

process.on( "SIGINT", function() {
  console.log( "\ngracefully shutting down from SIGINT (Crtl-C)" );
  process.exit();
} );

process.on( "exit", function() {
  console.log( "never see this log message" );
} );

setInterval( () => console.log( "tick" ), 2500 );

यहां छवि विवरण दर्ज करें

विंडोज़ कमांड प्रॉम्प्ट के साथ भी काम करता है।


मैंने इस पर भी ध्यान दिया। विंडोज 7 यहां मेरे लिए एक प्रमुख मुद्दा है
ग्रेगरी नोवाकोस्की

यह विधि विंडोज 7 पर नोड 8.11.1 के साथ मेरे लिए काम करती है - लेकिन मैं इसे गिट बैश शेल से चला रहा था। सोचा था कि मैं पहले सरल तरीके से कोशिश करूँगा और यह काम किया।
user944849

7

जब तक आपको अन्य कार्यों के लिए "रीडलाइन" आयात की आवश्यकता नहीं होती, तब तक मैं यह सत्यापित करूंगा कि यह विंडोज पर चल रहा है। इसके अतिरिक्त, जो लोग अनजान हो सकते हैं - यह विंडोज 32-बिट और विंडोज 64-बिट सिस्टम (जो "win32" कीवर्ड को वापस कर देगा) दोनों पर काम करता है। इस समाधान के लिए धन्यवाद गेब्रियल।

if (process.platform === "win32") {
  require("readline")
    .createInterface({
      input: process.stdin,
      output: process.stdout
    })
    .on("SIGINT", function () {
      process.emit("SIGINT");
    });
}

process.on("SIGINT", function () {
  // graceful shutdown
  process.exit();
});

5

आजकल यह विंडोज सहित सभी प्लेटफार्मों पर काम करता है

निम्न कोड लॉग करता है और फिर विंडोज 10 पर ठीक से समाप्त होता है:

process.on('SIGINT', () => {
    console.log("Terminating...");
    process.exit(0);
});

2
यह मेरे लिए cygwin के तहत काम नहीं करता है। नवीनतम विंडोज 10 (स्वचालित अपडेट), नोड संस्करण 8.11.4 का उपयोग करना। "यह काम नहीं करता है" से मेरा मतलब है कि 1) प्रक्रिया समाप्त हो जाती है, लेकिन 2) संदेश कंसोल में लॉग इन नहीं किया जाता है और 3) HTTP कनेक्शन बनाए गए बंद नहीं होते हैं। हालाँकि, मुझे यह जोड़ना चाहिए कि मैंने इसे PowerShell के तहत आज़माया था, और यह वहाँ अपेक्षित रूप से काम करता है। लेकिन मैंने साइबरविन पर स्विच किया क्योंकि पावरशेल में एक खराब कर्ल कमांड है। अरे!
जॉन डेगन

2
इसने बिना किसी स्पष्ट कारण के मेरे लिए आज ही काम करना बंद कर दिया (बिल्कुल भी अपडेट नहीं) और मुझे अभी भी पता नहीं है कि क्यों। स्वीकृत उत्तर ने इसे ठीक कर दिया।
Sv443

4

वर्तमान में विंडोज़ कंसोल नियंत्रण घटनाओं को कैप्चर करने के लिए नोड में अभी भी कोई समर्थन नहीं है, इसलिए पोसिक्स सिग्नल के समकक्ष नहीं हैं:

https://github.com/joyent/node/issues/1553

हालाँकि, tty मॉड्यूल प्रलेखन एक सुंदर बंद शुरू करने के लिए प्रमुख प्रेस पर कब्जा करने के लिए एक तंत्र का एक उदाहरण देता है, लेकिन फिर यह केवल ctrl+ के लिए काम करता है c

var tty = require('tty');

process.stdin.resume();
tty.setRawMode(true);

process.stdin.on('keypress', function(char, key) {
  if (key && key.ctrl && key.name == 'c') {
    console.log('graceful exit of process %d', process.pid);
    process.exit();
  }
});

धन्यवाद, इस जानकारी की तलाश में है, यह मेरे लिए स्वीकार्य प्रतिस्थापन है जब तक कि मैं इसे CTRL + C के लिए सर्वर पर लागू कर सकता हूं। +1 (लेकिन .. किसी भी विचार है कि क्या यह प्रक्रिया पर घटना श्रोताओं को जोड़कर प्रदर्शन को प्रभावित करेगा?)
कोरी सकल

मैंने ऐसा करने की कोशिश की, लेकिन जब मेरा सर्वर गेम लूप स्टड चला रहा है तो उपलब्ध नहीं लगता है, जब मैं ऊपर उपयोग करता हूं तो CTRL + C काम नहीं करता है।
कॉरी ग्रॉस

0

नोड के बाद से 0.8 keypressघटना अब मौजूद नहीं है। हालांकि एक npm पैकेज है जिसे keypress कहा जाता है जो ईवेंट को पुन: लागू करता है।

के साथ स्थापित करें npm install keypress, तो कुछ ऐसा करें :

// Windows doesn't use POSIX signals
if (process.platform === "win32") {
    const keypress = require("keypress");
    keypress(process.stdin);
    process.stdin.resume();
    process.stdin.setRawMode(true);
    process.stdin.setEncoding("utf8");
    process.stdin.on("keypress", function(char, key) {
        if (key && key.ctrl && key.name == "c") {
            // Behave like a SIGUSR2
            process.emit("SIGUSR2");
        } else if (key && key.ctrl && key.name == "r") {
            // Behave like a SIGHUP
            process.emit("SIGHUP");
        }
    });
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.