2011-08-24 3 views
7

Sto provando a eseguire un child_process in modo sincrono su node.js (Sì, lo so che è cattivo, ho una buona ragione) e recupero qualsiasi output su stdout, ma Non riesco a capire come ...node.js - esegue il comando in modo sincrono e ottiene il risultato

Ho trovato questo post SO: node.js execute system command synchronously che descrive come utilizzare una libreria (node-ffi) per eseguire il comando, e questo funziona alla grande, ma l'unica cosa che io ' m in grado di ottenere è il codice di uscita del processo. Qualsiasi dato eseguito dal comando viene inviato direttamente a stdout: come posso catturarlo?

> run('whoami') 
username 
0 

in altri termini, è username echo'd a stdout, il risultato di run è 0.

avrei molto piuttosto capire come leggere stdout

+0

Prova a guardare [qui] [1]. È la discussione della stessa domanda. [1]: http://stackoverflow.com/questions/4443597/node-js-execute-system-command-synchronously/8625316#8625316 – scherka

risposta

2

Così ho un lavoro soluzione, ma non esattamente come ... Basta postare qui per riferimento:

Sto usando la libreria node-ffi di riferimento nell'altro post SO. Ho una funzione che:

  • prende in un determinato comando
  • aggiunge >> run-sync-output
  • esegue lo
  • legge run-sync-output in modo sincrono e memorizza il risultato
  • cancella questo file tmp
  • restituisce il risultato

C'è un n problema ovvio in cui se l'utente non ha accesso in scrittura alla directory corrente, fallirà. Inoltre, è solo uno sforzo inutile. : -/

-2

Oltre a scrivere codice un po 'diverso, in realtà non c'è motivo di fare qualcosa sincronizzato.

Cosa non ti piace di questo? (docs)

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

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

In realtà non v'è in questo caso. Ho una libreria che si collega a 'stylus' che compila gli sprite CSS da singole immagini. Poiché 'stylus' è scritto in modo sincrono, qualsiasi hook deve essere sincronizzato. Non ho intenzione di riscrivere l'intero motore di analisi, e anche se l'avessi fatto probabilmente non sarebbe stato accettato nel ramo master e la mia libreria esterna funzionerebbe solo fuori dal mio ramo. –

+5

-1 "non c'è motivo ..." e come puoi dire? Odio questi argomenti inutili che non possono mai essere dimostrati corretti e in realtà ti sbagli, ci sono diversi casi in cui è necessario o di aiuto fare le cose in modo sincrono. – Tower

+0

@rFactor: in realtà non c'è motivo. Puoi dire che è più facile per te inserire correttamente il codice sincronizzato perché ci sei abituato, ma in realtà non c'è motivo. – dresende

1

ho costruito un modulo node.js che risolve questo problema esatto. Check it out :)

exec-plan

Aggiornamento

Il modulo di cui sopra risolve il problema originale, perché permette il concatenamento sincrona di processi figli. Ogni collegamento nella catena ottiene lo stdout dal processo precedente nella catena.

+0

Quale metodo/i in questo modulo può essere usato per ottenere l'output di un comando? –

+0

L'intenzione del modulo è di impostare una catena di comandi come un piano e lo stdout/err sarebbe reso disponibile alla funzione "preLogic" del comando "next" nel piano. Quindi, per esempio: se avessi execPlan.add ('ps -ef'); Quindi, sul tuo prossimo 'add', puoi usare una funzione "pre-logic" come primo parametro per usare l'output di 'ps -ef'. Ad esempio: execPlan.add (function (stdout) {// fa qualcosa con stdout da 'ps -ef' che viene eseguito prima di 'grep ls'}, 'grep ls') ;. Se questo commento non ha chiarito molto bene, potresti pubblicare sul sito github del modulo stesso? Inoltre, controlla il file README.md :) – Ryan

+0

E 'possibile restituire l'output della riga di comando come una stringa usando questo modulo (invece di stamparlo semplicemente usando console.log?) –

1

Ho avuto un problema simile e ho finito per scrivere un'estensione di nodo per questo. Puoi controllare il repository git. È open source e gratuito e tutte quelle cose buone!

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

ExecXI è un'estensione nodo scritto in C++ per eseguire comandi shell uno per uno, output output del comando alla console in tempo reale. Sono presenti modi concatenati e incatenati opzionali; significato che è possibile scegliere di interrompere lo script dopo un comando non riuscito (concatenato), oppure è possibile continuare come se nulla fosse accaduto!

Le istruzioni per l'uso sono nello ReadMe file. Sentiti libero di fare richieste di pull o inviare problemi!

Tuttavia non restituisce ancora lo stdout ... Beh, l'ho appena rilasciato oggi. Forse possiamo costruirci sopra.

In ogni caso, ho pensato che valesse la pena menzionarlo. Ho anche postato questo a una domanda simile: node.js execute system command synchronously