Tengo este script simple:
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
console.log(stdout);
});
donde simplemente ejecuto un comando para compilar un archivo de script de café. Pero stdout nunca se muestra en la consola, porque el comando nunca termina (debido a la opción -w de coffee). Si ejecuto el comando directamente desde la consola, recibo un mensaje como este:
18:05:59 - compiled my_file.coffee
Mi pregunta es: ¿es posible mostrar estos mensajes con el nodo.js exec? Si es así, ¿cómo? !
Gracias
node.js
coffeescript
mravey
fuente
fuente
Respuestas:
No utilice
exec
. Usospawn
que es unEventEmmiter
objeto. Luego puede escucharstdout
/stderr
eventos (spawn.stdout.on('data',callback..)
) a medida que suceden .De la documentación de NodeJS:
exec
almacena el resultado y generalmente lo devuelve cuando el comando ha terminado de ejecutarse.fuente
flush(stdout);
en C) para activar eventos en Node.js.exec
también devolverá un objeto ChildProcess que es un EventEmitter.O
pipe
la salida estándar del proceso secundario a la salida estándar principal.O heredar stdio usando spawn
fuente
pipe
:coffeeProcess.stdout.pipe(process.stdout);
spawn(cmd, argv, { stdio: 'inherit' })
. Consulte nodejs.org/api/child_process.html#child_process_options_stdio para ver diferentes ejemplos.spawn
constdio: 'inherit'
. Produce resultados más precisos queexec
y tuberíasstdout
/stderr
, por ejemplo, cuando se muestra la información de progreso de agit clone
.Ya hay varias respuestas, sin embargo, ninguna de ellas menciona la mejor (y más fácil) forma de hacerlo, que es usar
spawn
y la{ stdio: 'inherit' }
opción . Parece producir la salida más precisa, por ejemplo, cuando se muestra la información de progreso de agit clone
.Simplemente haz esto:
Gracias a @MorganTouvereyQuilling por señalar esto en este comentario .
fuente
stdio: "inherit"
conserva ese formato mientraschild.stdout.pipe(process.stdout)
que no lo hace.Solo me gustaría agregar que un pequeño problema con la salida de las cadenas de búfer de un proceso generado
console.log()
es que agrega nuevas líneas, que pueden extender su salida del proceso generado a través de líneas adicionales. Si salestdout
ostderr
con enprocess.stdout.write()
lugar deconsole.log()
, obtendrá la salida de la consola del proceso generado 'tal cual'.Vi esa solución aquí: Node.js: ¿imprimiendo en la consola sin una nueva línea final?
Espero que ayude a alguien a usar la solución anterior (que es excelente para la salida en vivo, incluso si es de la documentación).
fuente
spawn(command, args, { stdio: 'inherit' })
, como lo sugiere @MorganTouvereyQuilling aquí stackoverflow.com/questions/10232192/…Inspirado por la respuesta de Nathanael Smith y el comentario de Eric Freese, podría ser tan simple como:
fuente
ls
pero falla para comandos más complejos comonpm install
. Incluso intenté conectar tanto stdout como stderr a sus respectivos objetos de proceso.spawn(command, args, { stdio: 'inherit' })
, como se sugiere aquí stackoverflow.com/questions/10232192/…He encontrado útil agregar un script de ejecución personalizado a mis utilidades que hacen esto.
utilities.js
app.js
fuente
Después de revisar todas las otras respuestas, terminé con esto:
A veces
data
habrá varias líneas, por lo que eloldSchoolMakeBuild
encabezado aparecerá una vez para varias líneas. Pero esto no me molestó lo suficiente como para cambiarlo.fuente
child_process.spawn devuelve un objeto con secuencias stdout y stderr. Puede tocar la secuencia stdout para leer los datos que el proceso secundario envía de vuelta al Nodo. stdout siendo una secuencia tiene los "datos", "fin" y otros eventos que tienen las secuencias. Spawn se utiliza mejor cuando desea que el proceso secundario devuelva una gran cantidad de datos al nodo: procesamiento de imágenes, lectura de datos binarios, etc.
para que pueda resolver su problema usando child_process.spawn como se usa a continuación.
fuente
Aquí hay una función auxiliar asíncrona escrita en mecanografiado que parece hacer el truco para mí. Supongo que esto no funcionará para procesos de larga duración, pero ¿podría ser útil para alguien?
fuente