Tengo un script que emite 'hola', duerme un segundo, emite 'hola', duerme 1 segundo, y así sucesivamente. Ahora pensé que podría abordar este problema con este modelo.
var spawn = require('child_process').spawn,
temp = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR');
temp.stdout.pipe(process.stdout);
Ahora el problema es que la tarea debe completarse para que se muestre el resultado. Según tengo entendido, esto se debe al hecho de que el proceso recién generado toma el control de ejecución. Obviamente, node.js no admite subprocesos, ¿hay alguna solución? Mi idea era posiblemente ejecutar dos instancias, la primera con el propósito específico de crear la tarea y hacer que canalice la salida al proceso de la segunda instancia, considerando que esto se puede lograr.
node.js
spawn
capture-output
foklepoint
fuente
fuente
python
a continuación, no se olvide de pasar-u
bandera para que no búfer de salida de la consola, de lo contrario se verá como la escritura no es en vivo stackoverflow.com/a/49947671/906265Respuestas:
Todavía me estoy mojando los pies con Node.js, pero tengo algunas ideas. primero, creo que necesitas usar en
execFile
lugar despawn
;execFile
es para cuando tiene la ruta a un script, mientras quespawn
es para ejecutar un comando conocido que Node.js puede resolver contra la ruta de su sistema.1. Proporcione una devolución de llamada para procesar la salida almacenada en búfer:
2. Agregue un oyente al flujo stdout del proceso secundario ( 9thport.net )
Además, parece haber opciones mediante las cuales puede separar el proceso generado de la terminal de control de Node, lo que le permitiría ejecutarse de forma asincrónica. Aún no lo he probado, pero hay ejemplos en los documentos de la API que son algo como esto:
fuente
child.spawn()
con lashell
opción establecida entrue
. nodejs.org/api/…child.stdout.pipe(process.stdout);
javascript let childProcess = exec ( './script-to-run --arg1 arg1value', ( error, stdout, stderror ) => { console.log( '[CALLBACK]: ' + error ); // or stdout or stderror } ); // Same as with spawn: childProcess.stdout.on ( 'data', ( data ) => { console.log( '[LIVE]: ' + data ); // Here's your live data! } );
¡Es mucho más fácil ahora (6 años después)!
Spawn devuelve un childObject , con el que luego puedes escuchar eventos . Los eventos son:
También hay un montón de objetos de childObject , que son:
Vea más información aquí sobre childObject: https://nodejs.org/api/child_process.html
Asincrónico
Si desea ejecutar su proceso en segundo plano mientras el nodo aún puede continuar ejecutándose, use el método asincrónico. Aún puede optar por realizar acciones después de que se complete su proceso y cuando el proceso tenga alguna salida (por ejemplo, si desea enviar la salida de un script al cliente).
child_process.spawn (...); (Nodo v0.1.90)
Así es como usaría un método callback + asincrónico :
Usando el método anterior, puede enviar cada línea de salida del script al cliente (por ejemplo, usando Socket.io para enviar cada línea cuando recibe eventos en
stdout
ostderr
).Sincrónico
Si desea que el nodo detenga lo que está haciendo y espere hasta que se complete el script , puede usar la versión sincrónica:
child_process.spawnSync (...);(Nodo v0.11.12 +)
Problemas con este método:
Cómo usarlo:
fuente
child.stdout.setEncoding('utf8')
si desea que entren cadenas utf8.stdout
forma asincrónica, es decir, mientras el programa restante continúa, si el proceso continúa.console.log("Output 1"); console.error("Boom"); console.log("Output 2");
y estoy haciendospawnAsync('node ./script.js')
... ¿cómo conserva el orden de la salida? Mi salida siempre parece aparecer en el orden incorrecto.pipe
opipeline
o pasa en las opciones correspondientes aspawn
.Aquí está el enfoque más limpio que he encontrado:
fuente
Tuve un pequeño problema para obtener la salida de registro del comando "npm install" cuando generé npm en un proceso secundario. El registro en tiempo real de las dependencias no se mostró en la consola principal.
La forma más sencilla de hacer lo que quiere el póster original parece ser esta (generar npm en Windows y registrar todo en la consola principal):
fuente
Me encontré requiriendo esta funcionalidad con la suficiente frecuencia que la empaqueté en una biblioteca llamada std-pour . Debería permitirle ejecutar un comando y ver la salida en tiempo real. Para instalar simplemente:
Entonces es bastante simple ejecutar un comando y ver el resultado en tiempo real:
Se basa en la promesa para que pueda encadenar varios comandos. Incluso es compatible con la firma de funciones, por
child_process.spawn
lo que debería ser un reemplazo directo en cualquier lugar donde lo esté usando.fuente
niño:
padre:
fuente
Passthru similar a PHP
Uso
fuente
Agregar una respuesta relacionada con
child_process.exec
ya que yo también había necesitado comentarios en vivo y no recibí ninguno hasta que terminó el guión. Esto también complementa mi comentario a la respuesta aceptada, pero como está formateado será un poco más comprensible y más fácil de leer.Básicamente, tengo un script npm que llama a Gulp, invocando una tarea que posteriormente se usa
child_process.exec
para ejecutar un script bash o por lotes según el sistema operativo. Cualquier script ejecuta un proceso de compilación a través de Gulp y luego realiza algunas llamadas a algunos binarios que funcionan con la salida de Gulp.Es exactamente como los demás (spawn, etc.), pero en aras de la finalización, aquí se explica exactamente cómo hacerlo:
Ahora es tan simple como agregar un detector de eventos. Para
stdout
:Y para
stderr
:No está nada mal - HTH
fuente