2013-01-15 12 views
45

मेरे पास एक स्क्रिप्ट है जो 'हाय' आउटपुट करती है, एक सेकंड के लिए सोती है, आउटपुट 'हाय', 1 सेकंड के लिए सोती है, और इसी तरह आगे। अब मैंने सोचा कि मैं इस मॉडल से इस समस्या से निपटने में सक्षम हूं।नोड.जेएस स्पॉन बाल प्रक्रिया और टर्मिनल आउटपुट लाइव

var spawn = require('child_process').spawn, 
temp = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR'); 

temp.stdout.pipe(process.stdout); 

अब समस्या यह है कि उत्पादन को प्रदर्शित करने के लिए कार्य को समाप्त करने की आवश्यकता है। जैसा कि मैं इसे समझ रहा हूं, यह इस तथ्य के कारण है कि नव निर्मित प्रक्रिया निष्पादन नियंत्रण लेती है। जाहिर है node.js धागे का समर्थन नहीं करता है तो कोई समाधान? मेरा विचार संभवतः दो उदाहरणों को चलाने के लिए था, पहला कार्य को बनाने के विशिष्ट उद्देश्य के लिए और इसे दूसरे उदाहरण की प्रक्रिया के लिए उत्पादन को पाइप करना है, इस पर विचार किया जा सकता है।

उत्तर

52

मैं अभी भी अपने पैरों को नोड.जेएस के साथ गीला कर रहा हूं, लेकिन मेरे पास कुछ विचार हैं। सबसे पहले, मुझे विश्वास है कि आपको spawn के बजाय execFile का उपयोग करने की आवश्यकता है; execFile आपके लिए एक स्क्रिप्ट का पथ है, जबकि spawn एक प्रसिद्ध आदेश निष्पादित करने के लिए है जो Node.js आपके सिस्टम पथ के विरुद्ध हल कर सकता है।

var child = require('child_process').execFile('path/to/script', [ 
    'arg1', 'arg2', 'arg3', 
], function(err, stdout, stderr) { 
    // Node.js will invoke this callback when the 
    console.log(stdout); 
}); 

2. stdout stream (9thport.net) बच्चे प्रक्रिया 'के लिए एक श्रोता जोड़े

var child = require('child_process').execFile('path/to/script', [ 
    'arg1', 'arg2', 'arg3' ]); 
// use event hooks to provide a callback to execute when data are available: 
child.stdout.on('data', function(data) { 
    console.log(data.toString()); 
}); 

इसके अलावा, विकल्प जिससे प्रतीत:

1. Provide a callback बफ़र उत्पादन प्रक्रिया करने के लिए आप नोड के नियंत्रण टर्मिनल से उत्पन्न प्रक्रिया को अलग कर सकते हैं, जो इसे असीमित रूप से चलाने की अनुमति देगा। मैं अभी तक यह परीक्षण नहीं किया है, लेकिन वहाँ जो कुछ इस तरह जाना API docs में उदाहरण हैं:

child = require('child_process').execFile('path/to/script', [ 
    'arg1', 'arg2', 'arg3', 
], { 
    // detachment and ignored stdin are the key here: 
    detached: true, 
    stdio: [ 'ignore', 1, 2 ] 
}); 
// and unref() somehow disentangles the child's event loop from the parent's: 
child.unref(); 
child.stdout.on('data', function(data) { 
    console.log(data.toString()); 
}); 

+5

बोनस अंक हैं। – DynamicDan

+1

आप 'shell' विकल्प' 'true' पर सेट 'child.spawn()' का उपयोग कर सकते हैं। https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options – CedX

+1

तुम भी पाइप सीधे 'child.stdout.pipe (process.stdout) के साथ process.stdout को child.stdout कर सकते हैं;' – darkadept

1

बच्चे:

setInterval(function() { 
    process.stdout.write("hi"); 
}, 1000); // or however else you want to run a timer 

माता-पिता:

require('child_process').fork('./childfile.js'); 
// fork'd children use the parent's stdio 
60

यह बहुत आसान है अब (2 साल बाद)!

स्पोन रिटर्न एक childObject, जिसे फिर आप घटनाओं के साथ के लिए सुन सकते हैं।घटनाओं हैं:

  • कक्षा: ChildProcess
    • घटना: 'त्रुटि'
    • घटना: 'exit'
    • घटना: 'बंद'
    • घटना: 'डिस्कनेक्ट'
    • घटना: 'संदेश'

वहाँ भी childObject से वस्तुओं का एक समूह रहे हैं, वे हैं:

  • कक्षा: ChildProcess
    • child.stdin
    • child.stdout
    • child.stderr
    • बच्चे .stdio
    • child.pid
    • child.connected
    • child.kill ([संकेत])
    • child.send (संदेश [, sendHandle] [, कॉलबैक])
    • child.disconnect()

देखें childObject बारे में अधिक जानकारी यहाँ: https://nodejs.org/api/child_process.html

तो, यह के सभी संयोजन, आपको मिलता है:

var spawn = require('child_process').spawn; 
var child = spawn('node ./commands/server.js'); 
child.stdout.on('data', function(data) { 
    console.log('stdout: ' + data); 
    //Here is where the output goes 
}); 
child.stderr.on('data', function(data) { 
    console.log('stderr: ' + data); 
    //Here is where the error output goes 
}); 
child.on('close', function(code) { 
    console.log('closing code: ' + code); 
    //Here you can get the exit code of the script 
}); 

और इस तरह आप नोड के साथ आउटपुट प्राप्त कर सकते हैं!

+4

+1, इस होना चाहिए अभी सही जवाब के रूप में चुना गया है। बस एक नोट, कॉलबैक में डेटा वैरिएबल बफर ऑब्जेक्ट के रूप में आता है। यदि आप utf8 स्ट्रिंग्स में आना चाहते हैं तो आप '' 'child.stdout.setEncoding ('utf8')' '' का उपयोग कर सकते हैं। – Ashish

+0

मैं एक पायथन स्क्रिप्ट चलाने की कोशिश कर रहा हूं; इसका चल रहा है लेकिन आउटपुट यहां नहीं आ रहा है। 'var spawn = आवश्यकता ('child_process')। spawn; var child = spawn ('पायथन', ['/my/path/to/python/file/my_python_file.py']); child.stdout.on ('डेटा', फ़ंक्शन (डेटा) { console.log ('stdout:' + data); }); child.stderr.on ('डेटा', फ़ंक्शन (डेटा) { console.log ('stderr:' + data); }); child.on ('बंद करें', फ़ंक्शन (कोड) { console.log ('समापन कोड:' + कोड); }); ' – ishandutta2007

10

जब मैंने एक बच्चे की प्रक्रिया में एनपीएम पैदा किया तो मुझे "एनपीएम इंस्टॉल" कमांड से लॉग आउट आउटपुट प्राप्त करने में थोड़ी परेशानी थी। निर्भरता का रीयलटाइम लॉगिंग पैरेंट कंसोल में नहीं दिखाया गया था।

var args = ['install']; 

var options = { 
    stdio: 'inherit' //feed all child process logging into parent process 
}; 

var childProcess = spawn('npm.cmd', args, options); 
childProcess.on('close', function(code) { 
    process.stdout.write('"npm install" finished with code ' + code + '\n'); 
}); 
0

मुझे लगने इस कार्यक्षमता अक्सर पर्याप्त है कि मैं इसे पैक की आवश्यकता होती है:

क्या मूल पोस्टर चाहता है ऐसा करने के लिए सबसे आसान तरीका यह (खिड़कियों पर अंडे NPM और लॉग माता पिता कंसोल के लिए सब कुछ) हो रहा है std-pour नामक लाइब्रेरी में। यह आपको कमांड निष्पादित करने और वास्तविक समय में आउटपुट देखने देता है। बस स्थापित करने के लिए:

const { pour } = require('std-pour'); 
pour('ping', ['8.8.8.8', '-c', '4']).then(code => console.log(`Error Code: ${code}`)); 

यह आधारित जिसका वादा किया गया तो आप कर सकते हैं श्रृंखला कई कमांड:

npm install std-pour 

तो यह काफी सरल एक आदेश पर अमल और वास्तविक समय में उत्पादन को देखने के लिए है। यह child_process.spawn के साथ भी फ़ंक्शन हस्ताक्षर-संगत है, इसलिए इसे कहीं भी आप इसे उपयोग कर रहे प्रतिस्थापन में एक बूंद होना चाहिए।

3

यहाँ साफ दृष्टिकोण मैंने पाया है: आप कैसे कार्यकारी() के रूप में मैं एक खोल cmd पर अमल करने की जरूरत है के साथ ऐसा करने की व्याख्या कर सकते

require("child_process").spawn('bash', ['./script.sh'], { 
    cwd: process.cwd(), 
    detached: true, 
    stdio: "inherit" 
}); 
संबंधित मुद्दे