Exec: affichage stdout “live”

J’ai ce script simple:

var exec = require('child_process').exec; exec('coffee -cw my_file.coffee', function(error, stdout, stderr) { console.log(stdout); }); 

où j’exécute simplement une commande pour comstackr un fichier de script de café. Mais stdout ne s’affiche jamais dans la console, car la commande ne se termine jamais (à cause de l’option -w de café). Si j’exécute la commande directement depuis la console, je reçois un message comme celui-ci:

 18:05:59 - comstackd my_file.coffee 

Ma question est la suivante: est-il possible d’afficher ces messages avec l’exécutable node.js? Si oui comment? !

Merci

N’utilisez pas exec . Utilisez spawn qui est un object EventEmmiter . Vous pouvez alors écouter les événements stdout / stderr ( spawn.stdout.on('data',callback..) ) à mesure qu’ils se produisent .

De la documentation NodeJS:

 var spawn = require('child_process').spawn, ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data', function (data) { console.log('stdout: ' + data.toSsortingng()); }); ls.stderr.on('data', function (data) { console.log('stderr: ' + data.toSsortingng()); }); ls.on('exit', function (code) { console.log('child process exited with code ' + code.toSsortingng()); }); 

exec tampon la sortie et la retourne généralement une fois l’exécution de la commande terminée.

exec retournera également un object ChildProcess qui est un EventEmitter.

 var exec = require('child_process').exec; var coffeeProcess = exec('coffee -cw my_file.coffee'); coffeeProcess.stdout.on('data', function(data) { console.log(data); }); 

OU pipe la sortie standard du processus enfant vers la sortie principale.

 coffeeProcess.stdout.pipe(process.stdout); 

Il y a déjà plusieurs réponses, mais aucune ne mentionne la meilleure façon (et la plus simple) de le faire, à savoir utiliser spawn et l’ option { stdio: 'inherit' } . Il semble produire la sortie la plus précise, par exemple lors de l’affichage des informations de progression à partir d’un git clone .

Faites simplement ceci:

 var spawn = require('child_process').spawn; spawn('coffee', ['-cw', 'my_file.coffee'], { stdio: 'inherit' }); 

Nous remercions @MorganTouvereyQuilling de l’avoir signalé dans ce commentaire .

Je voudrais juste append qu’un petit problème avec la sortie des chaînes de tampon d’un processus généré avec console.log() est qu’il ajoute de nouvelles lignes, ce qui peut répartir la sortie de votre processus généré sur des lignes supplémentaires. Si vous produisez stdout ou stderr avec process.stdout.write() au lieu de console.log() , vous obtiendrez la sortie de la console à partir du processus généré “tel console.log() “.

J’ai vu cette solution ici: Node.js: impression sur console sans ligne de fond?

J’espère que cela aidera quelqu’un qui utilise la solution ci-dessus (ce qui est excellent pour la sortie en direct, même si cela provient de la documentation).

Inspiré par la réponse de Nathanael Smith et le commentaire d’Eric Freese, il pourrait être aussi simple que:

 var exec = require('child_process').exec; exec('coffee -cw my_file.coffee').stdout.pipe(process.stdout); 

Après avoir examiné toutes les autres réponses, je me suis retrouvé avec ceci:

 function oldSchoolMakeBuild(cb) { var makeProcess = exec('make -C ./oldSchoolMakeBuild', function (error, stdout, stderr) { stderr && console.error(stderr); cb(error); }); makeProcess.stdout.on('data', function(data) { process.stdout.write('oldSchoolMakeBuild: '+ data); }); } 

Parfois, les data seront oldSchoolMakeBuild plusieurs lignes, de sorte que l’en oldSchoolMakeBuild tête oldSchoolMakeBuild apparaîtra une fois pour plusieurs lignes. Mais cela ne me dérangeait pas assez pour le changer.

J’ai trouvé utile d’append un script exec personnalisé à mes utilitaires qui le font.

utilities.js

 const { exec } = require('child_process') module.exports.exec = (command) => { const process = exec(command) process.stdout.on('data', (data) => { console.log('stdout: ' + data.toSsortingng()) }) process.stderr.on('data', (data) => { console.log('stderr: ' + data.toSsortingng()) }) process.on('exit', (code) => { console.log('child process exited with code ' + code.toSsortingng()) }) } 

app.js

 const { exec } = require('./utilities.js) exec('coffee -cw my_file.coffee') 

child_process.spawn renvoie un object avec les stream stdout et stderr. Vous pouvez appuyer sur le stream stdout pour lire les données renvoyées par le processus enfant au nœud. stdout étant un stream a les “données”, “fin”, et d’autres événements que les stream ont. spawn est mieux utilisé lorsque vous voulez que le processus enfant renvoie une grande quantité de données à Node – traitement de l’image, lecture des données binarys, etc.

ainsi vous pouvez résoudre votre problème en utilisant child_process.spawn tel qu’utilisé ci-dessous.

 var spawn = require('child_process').spawn, ls = spawn('coffee -cw my_file.coffee'); ls.stdout.on('data', function (data) { console.log('stdout: ' + data.toSsortingng()); }); ls.stderr.on('data', function (data) { console.log('stderr: ' + data.toSsortingng()); }); ls.on('exit', function (code) { console.log('code ' + code.toSsortingng()); });