Sto provando a lanciare un comando shell da Node.js, senza reindirizzare l'input e l'output di quel comando, proprio come eseguire il bombardamento su un comando utilizzando uno script di shell o utilizzando il comando system
di Ruby. Se il processo figlio vuole scrivere su STDOUT, voglio che vada direttamente alla console (o venga reindirizzato, se l'output dell'app della Node è stato reindirizzato).Esecuzione di un comando shell da Node.js senza buffer di output
Il nodo non sembra avere un modo semplice per farlo. Sembra che l'unico modo per eseguire un altro processo sia con child_process
, che sempre reindirizza l'input e l'output del processo secondario alle pipe. Posso scrivere il codice per accettare i dati da queste pipe e scriverlo su STDOUT e STDERR del mio processo, ma se lo faccio, le API mi costringono a sacrificare un po 'di flessibilità.
Voglio due caratteristiche:
- sintassi Shell. Voglio essere in grado di convogliare l'output tra i comandi o eseguire file batch di Windows.
- Uscita illimitata. Se eseguo il bombardamento su un compilatore e desidera generare megabyte di avvisi del compilatore, voglio che tutti scorrano attraverso lo schermo (finché l'utente non si ammala e preme Ctrl + C).
Sembra che Node voglia forzarmi a scegliere tra queste due funzioni.
- Se voglio una quantità illimitata di uscita, posso usare
child_process.spawn
e poi farechild.stdout.on('data', function(data) { process.stdout.write(data); });
e la stessa cosa perstderr
, e sarà felicemente i dati di tubo fino a quando le mucche tornare a casa. Sfortunatamente,spawn
non supporta la sintassi della shell. - Se voglio la sintassi della shell, posso usare
child_process.exec
. Maexec
insiste sul buffering del processo figlio STDOUT e STDERR per me e me li consegna tutti alla fine e limita la dimensione di questi buffer (configurabile, 200K per impostazione predefinita). Posso ancora agganciare gli evention('data')
, se voglio vedere l'output come è stato generato, ma loexec
aggiungerà ancora i dati ai suoi buffer. Quando la quantità di dati supera la dimensione del buffer predefinita,exec
interromperà il processo figlio.
(C'è anche child_process.execFile
, che è il peggiore dei due mondi dal punto di vista flessibilità:. Alcuna sintassi shell, ma si devono ancora coronare la quantità di output che ci si aspetta)
mi manca qualcosa? Esiste un modo per eseguire semplicemente lo shell out su un processo figlio nel nodo e non reindirizzare il proprio input e output? Qualcosa che supporta la sintassi della shell e non si espelle dopo una quantità predefinita di output, proprio come è disponibile negli script della shell, in Ruby, ecc.?
Lo hai mai capito? Sono in una situazione simile. –
lo stesso numero, 'fino a quando le mucche tornano a casa' grazie, per questo, ha reso il mio giorno dopo 10 ore di lavoro – neric