2011-08-24 15 views
7

मैं (हाँ, मैं जानता हूँ कि यह बुरा है, मैं एक अच्छा कारण है) Node.js में तुल्यकालिक एक child_process निष्पादित और stdout पर किसी भी उत्पादन प्राप्त करने का प्रयास कर रहा हूँ परिणाम मिलता है, लेकिन मैं काफी समझ नहीं सकता कि कैसे ...Node.js - तुल्यकालिक आदेश निष्पादित और

मुझे यह SO पोस्ट मिला: node.js execute system command synchronously जो आदेश को निष्पादित करने के लिए लाइब्रेरी (नोड-एफएफआई) का उपयोग करने का वर्णन करता है, और यह बहुत अच्छा काम करता है, लेकिन केवल एक चीज है I मैं प्रक्रिया निकास कोड प्राप्त करने में सक्षम हूँ। कमांड निष्पादित करने वाला कोई भी डेटा सीधे stdout पर भेजा जाता है - मैं इसे कैप्चर कैसे करूं?

> run('whoami') 
username 
0 
otherwords में

, username stdout में echo'd है, run का परिणाम 0 है।

मैं चाहते ज्यादा बल्कि यह पता लगाने कैसे stdout को पढ़ने के लिए

+0

[यहां] [1] देखने की कोशिश करें। यह एक ही प्रश्न की चर्चा है। [1]: http://stackoverflow.com/questions/4443597/node-js-execute-system-command-synchronously/8625316#8625316 – scherka

उत्तर

2

तो मैं एक समाधान काम कर रहे है, लेकिन वास्तव में यह पसंद नहीं है ... बस यहाँ संदर्भ के लिए पोस्टिंग:

मैं अन्य एसओ पोस्ट में संदर्भित node-ffi लाइब्रेरी का उपयोग कर रहा हूं। मैं एक समारोह है कि है:

  • किसी दिए गए आदेश में लेता है
  • संलग्न कर देता है >> run-sync-output
  • कार्यान्वित यह
  • तुल्यकालिक पढ़ता run-sync-output और दुकानों परिणाम
  • इस tmp फ़ाइल
  • रिटर्न परिणाम
  • को हटा देता है

एक है n स्पष्ट मुद्दा जहां उपयोगकर्ता के पास वर्तमान निर्देशिका में लेखन पहुंच नहीं है, तो यह असफल हो जाएगी। इसके अलावा, यह सिर्फ बर्बाद प्रयास है। : -/

-2

कोड लिखने एक छोटे से विभिन्न अलावा, वास्तव में synched कुछ भी करने को कोई कारण नहीं है।

आप इस बारे में क्या पसंद नहीं है? (docs)

var exec = require('child_process').exec; 

exec('whoami', function (error, username) { 
    console.log('stdout: %s', username); 
    continueWithYourCode(); 
}); 
+0

असल में वहाँ इस मामले में है। मेरे पास 'स्टाइलस' में एक लाइब्रेरी हैकिंग है जो अलग-अलग छवियों से सीएसएस स्प्राइट को संकलित करती है। चूंकि 'स्टाइलस' सिंक्रनाइज़ रूप से लिखा गया है, इसलिए किसी भी हुक को सिंक भी होना चाहिए। मैं पूरे पार्सिंग इंजन को फिर से लिखने वाला नहीं हूं, और यहां तक ​​कि अगर मैंने ऐसा किया तो संभवतः मास्टर शाखा में स्वीकार नहीं किया जाएगा और मेरी बाहरी लाइब्रेरी केवल मेरी शाखा से ही काम करेगी। –

+5

-1 "कोई कारण नहीं है ..." और आप कैसे बता सकते हैं? मुझे इन व्यर्थ तर्कों से नफरत है जो कभी भी सही साबित नहीं हो सकते हैं और असल में आप गलत हैं, ऐसे कई मामले हैं जब यह या तो चीजों को सिंक्रनाइज़ करने में मदद या जरूरी है। – Tower

+0

@rFactor: वास्तव में कोई कारण नहीं है। आप कह सकते हैं कि आपके लिए सही सिंक कोड होना आसान है क्योंकि आप इसका उपयोग कर रहे हैं लेकिन वास्तव में कोई कारण नहीं है। – dresende

1

मैं एक Node.js मॉड्यूल है कि इस सटीक समस्या का हल निर्माण किया है। इसे देखें :)

exec-plan

अद्यतन

ऊपर मॉड्यूल, अपने मूल समस्या का हल है क्योंकि यह बच्चे प्रक्रियाओं के तुल्यकालिक श्रृंखलन के लिए अनुमति देता है। श्रृंखला में प्रत्येक लिंक श्रृंखला में पिछली प्रक्रिया से stdout मिलता है।

+0

इस मॉड्यूल में कौन सी विधि का उपयोग कमांड के आउटपुट को प्राप्त करने के लिए किया जा सकता है? –

+0

मॉड्यूल का इरादा कमांड की एक श्रृंखला को एक योजना के रूप में स्थापित करना है, और योजना में "अगली" कमांड के "प्रीलॉगिक" फ़ंक्शन में स्टडआउट/त्रुटि उपलब्ध कराई जाएगी। तो, उदाहरण के लिए: यदि आपके पास execPlan.add ('ps -ef') था; फिर, अपने अगले 'एड' पर, आप 'ps -ef' के आउटपुट का उपयोग करने के लिए पहले पैरामीटर के रूप में "प्री लॉजिक" फ़ंक्शन का उपयोग कर सकते हैं। उदाहरण के लिए: execPlan.add (फ़ंक्शन (stdout) {// 'ps -ef' से stdout के साथ कुछ करें जो 'grep ls'}, 'grep ls' से पहले चलता है); अगर इस टिप्पणी ने बहुत अच्छी तरह से स्पष्टीकरण नहीं दिया है, तो क्या आप मॉड्यूल की जिथब साइट पर ही पोस्ट कर सकते हैं? इसके अलावा, README.md चेकआउट करें :) – Ryan

+0

क्या इस मॉड्यूल का उपयोग करके स्ट्रिंग के रूप में कमांड लाइन आउटपुट वापस करना संभव है (केवल console.log का उपयोग करके इसे प्रिंट करने के बजाय?) –

1

मैं एक ऐसी ही समस्या थी और मैं इस के लिए एक नोड विस्तार लेखन समाप्त हो गया। आप गिट भंडार की जांच कर सकते हैं। यह खुला स्रोत और मुफ्त है और यह सब अच्छी चीजें है!

https://github.com/aponxi/npm-execxi

ExecXI एक नोड विस्तार C++ लिखा खोल निष्पादित करने के लिए है एक के बाद एक आदेश, वास्तविक समय में कंसोल के लिए आदेश के उत्पादन outputting। वैकल्पिक जंजीर, और अनचाहे तरीके मौजूद हैं; जिसका मतलब है कि आप कमांड के बाद स्क्रिप्ट को रोकने के लिए चुन सकते हैं (जंजीर) विफल रहता है, या आप जारी रख सकते हैं जैसे कुछ भी नहीं हुआ है!

उपयोग निर्देश ReadMe file में हैं। पुल अनुरोध करने या मुद्दों को जमा करने के लिए स्वतंत्र महसूस करें!

हालांकि यह अभी तक stdout वापस नहीं करता है ... ठीक है, मैंने अभी इसे जारी किया है। शायद हम इसे बना सकते हैं।

वैसे भी, मैंने सोचा कि यह उल्लेख करना उचित था। मैंने इसे एक समान प्रश्न पर भी पोस्ट किया: node.js execute system command synchronously

संबंधित मुद्दे