windows process.exit(0): आउटपुट गायब हो जाता है?



node.js emacs (1)

ओफ़्फ़, मैंने इसे अपने आप समझ लिया सबसे पहले, मुझे पता चला कि एक देरी से उत्पादन को प्रकट होने का कारण बनता है:

hello_3.js :

console.log('Hello world!');
setTimeout(function () {
    process.exit(5);
}, 1000);

आउटपुट:

Hello world!
5

इसलिए मैंने console लिए नोड। जेएस दस्तावेज की जांच की, और पाया :

कंसोल फ़ंक्शंस सिंक्रोनस हैं जब गंतव्य टर्मिनल या फ़ाइल है (समय से पहले निकास के मामले में खोए हुए संदेश से बचने के लिए) और एसिंक्रोनस जब यह एक पाइप है (लंबे समय तक अवरुद्ध करने से बचने के लिए)।

फिर मैंने यह सुनिश्चित करने का निर्णय लिया कि कोई पाइप इस्तेमाल नहीं किया गया है और एक बैच स्क्रिप्ट hello_2.bat लिखा है:

@ECHO OFF
node hello_2.js >test
TYPE test

स्क्रिप्ट को कॉल करते समय आउटपुट (call-process "cmd.exe" nil t nil "/C" "hello_2.bat") :

Hello world!
0

(रिटर्न वैल्यू 5 के बजाय 0 है, लेकिन मुझे इसकी परवाह नहीं है)

मेरे प्रश्न का उत्तर देने के लिए:

  1. ऐसा लगता है कि विंडोज़ पर एमएसीएस में call-process प्रोग्राम्स से आउटपुट प्राप्त करने के लिए एक पाइप का उपयोग करता है।

    जैसा कि मैंने ईएसहेल का भी उल्लेख किया है: विंडोज पर नोड। जेएस द्वारा टर्मिनल के रूप में मान्यता नहीं मिलती, और संभवतः ईएसहोल आंतरिक रूप से call-process का उपयोग करता call-process या कार्यक्रम चलाने के समान है।

  2. मानक आउटपुट के लिए गंतव्य के रूप में पाइप की जांच का कारण console.log को अतुल्यकालिक रूप से चलाया जा सकता है।

  3. Windows पर Node.js में process.exit(5) सभी अनुसूचित असिंक्रोनस कार्यों को त्यागने लगता है, और इस प्रकार कोई आउटपुट उत्पन्न नहीं किया जाता है।

    यह धारणा विंडोज कमांड प्रॉम्प्ट के अंदर एक पाइप को निर्णायक निर्देश देने के नतीजे से समर्थित है:

    C:\Temp> node hello_2.js | MORE
    
    C:\Temp>

अंत में, मुझे पता चला कि इस मुद्दे को एक साल पहले (सितंबर 2013 तक) के बाद से जाना जाता है

Emacs lisp कमांड कॉलिंग node hello.js :

(call-process "node" nil t nil "hello.js")

hello.jshello.js दो प्रकार:

  • hello_1.js :

    console.log('Hello world!');

    आउटपुट:

    Hello world!
    0
  • hello_2.js :

    console.log('Hello world!');
    process.exit(5);

    आउटपुट (लॉग स्टेटमेंट से कोई आउटपुट नहीं!):

    5

क्या कारण है कि process.exit(5) आउटपुट को दबाए जाने का कारण बनता है?

टिप्पणियाँ:

  • मैंने 2013/03/17 के जीएनयू एमएसीएस 24.3.1 (आईओएसआईएम-एनआईटी 5.1.2600) में समस्या का अनुभव किया है, जो कि मैरविइन पर नोड। जेएस v0.10.18 के साथ संयोजन में है, जो विंडोज़ एक्सपी / एसपी 3/32 पर चल रहा है।

  • मैंने नोड कमांड लाइन निष्पादित करने के लिए EShell की कोशिश की: कोई आउटपुट नहीं

  • process.exit() कम स्तर की process.reallyExit() कॉल करता है process.reallyExit() वास्तव में process.reallyExit() , जो समस्या का कारण बनता है: कोई आउटपुट नहीं

    process.reallyExit() को सी ++ में लागू किया गया है:

    void Exit(const FunctionCallbackInfo<Value>& args) {
      HandleScope scope(node_isolate);
      exit(args[0]->IntegerValue());
    }

    [...]

    NODE_SET_METHOD(process, "reallyExit", Exit);