Devo acquisire in uno stream personalizzato stream di un processo figlio generato.Node.js: Cattura STDOUT di `child_process.spawn`
child_process.spawn(command[, args][, options])
Per esempio,
var s = fs.createWriteStream('/tmp/test.txt');
child_process.spawn('ifconfig', [], {stdio: [null, s, null]})
Ora come faccio a leggere dalla /tmp/test.txt
in tempo reale?
Sembra che child_process.spawn
non utilizzi stream.Writable.prototype.write
né stream.Writable.prototype._write
per la sua esecuzione.
Per esempio,
s.write = function() { console.log("this will never get printed"); };
Così come,
s.__proto__._write = function() { console.log("this will never get printed"); };
Sembra che utilizza descrittori di file under-the-hood di scrivere da child_process.spawn
a un file.
Facendo questo non funziona:
var s2 = fs.createReadStream('/tmp/test.txt');
s2.on("data", function() { console.log("this will never get printed either"); });
Così, come posso ottenere le STDOUT
contenuto di un processo figlio?
Quello che voglio ottenere è lo stream STDOUT
di un processo figlio in un socket. Se fornisco la presa direttamente al parametro child_process.spawn
come parametro stdio
, chiude il socket quando termina, ma voglio tenerlo aperto.
Aggiornamento:
La soluzione è quella di utilizzare di default {stdio: ['pipe', 'pipe', 'pipe']}
opzioni e ascoltare il creato .stdout
del processo figlio.
var cmd = child_process.spaw('ifconfig');
cmd.stdout.on("data", (data) => { ... });
Ora, per alzare la posta, una domanda più impegnativa:
- Come si può leggere la STDOUT
del processo figlio e conservano ancora i colori?
Ad esempio, se si inviano STDOUT
a process.stdout
in questo modo:
child_process.spawn('ifconfig', [], {stdio: [null, process.stdout, null]});
manterrà i colori e stampa a colori in uscita per la console, perché la proprietà .isTTY
è impostato su true
process.stdout
.
process.stdout.isTTY // true
Ora, se si utilizza il default {stdio: ['pipe', 'pipe', 'pipe']}
, i dati che leggerete sarà spogliato di colori della console. Come ottieni i colori?
Un modo per farlo sarebbe creare il proprio flusso personalizzato con fs.createWriteStream
, perché child_process.spawn
richiede che i flussi abbiano un descrittore di file.
Quindi impostare .isTTY
di tale flusso su true
, per preservare i colori.
E infine si avrebbe bisogno di catturare i dati che cosa child_process.spawn
scrive a quella corrente, ma dal momento che child_process.spawn
non usa né .prototype.write
.prototype._write
del torrente, si avrebbe bisogno di catturare il suo contenuto in qualche altro hacky modo.
Questo è probabilmente il motivo per child_process.spawn
richiede che il flusso di avere un descrittore di file perché bypassa la chiamata .prototype.write
e scrive direttamente sul file under-the-hood.
Qualche idea su come implementarlo?
funziona come un fascino! – Vad
In questo modo si blocca il flusso di output tra le istruzioni o si perde un output in quell'intervallo? –
@AsadSaeeduddin no, non blocca. – Magomogo