node.js - node - process spawn
Use child_process.execSync pero mantenga la salida en la consola (3)
Me gustaría usar el método
execSync
que se agregó en NodeJS 0.12 pero aún tengo el resultado en la ventana de la consola desde la que ejecuté el script Node.
Por ejemplo, si ejecuto un script NodeJS que tiene la siguiente línea, me gustaría ver la salida completa del comando rsync "live" dentro de la consola:
require(''child_process'').execSync(''rsync -avAXz --info=progress2 "/src" "/dest"'');
Entiendo que
execSync
devuelve la salida del comando y que podría imprimir eso en la consola después de la ejecución, pero de esta manera no tengo salida "en vivo" ...
A menos que redirija stdout y stderr como sugiere la respuesta aceptada, esto no es posible con execSync o spawnSync. Sin redireccionar stdout y stderr, esos comandos solo devuelven stdout y stderr cuando se completa el comando.
Para hacer esto sin redirigir stdout y stderr, necesitará usar spawn para hacer esto, pero es bastante sencillo:
var spawn = require(''child_process'').spawn;
//kick off process of listing files
var child = spawn(''ls'', [''-l'', ''/'']);
//spit stdout to screen
child.stdout.on(''data'', function (data) { process.stdout.write(data.toString()); });
//spit stderr to screen
child.stderr.on(''data'', function (data) { process.stdout.write(data.toString()); });
child.on(''close'', function (code) {
console.log("Finished with code " + code);
});
Utilicé un comando ls que enumera archivos de forma recursiva para que pueda probarlo rápidamente. Spawn toma como primer argumento el nombre del ejecutable que está intentando ejecutar y, como segundo argumento, toma una serie de cadenas que representan cada parámetro que desea pasar a ese ejecutable.
Sin embargo, si está configurado para usar execSync y no puede redirigir stdout o stderr por alguna razón, puede abrir otro terminal como xterm y pasarle un comando como este:
var execSync = require(''child_process'').execSync;
execSync("xterm -title RecursiveFileListing -e ls -latkR /");
Esto le permitirá ver qué está haciendo su comando en el nuevo terminal, pero aún tendrá la llamada síncrona.
Puede pasar el stdio del padre al proceso hijo si eso es lo que desea:
require(''child_process'').execSync(
''rsync -avAXz --info=progress2 "/src" "/dest"'',
{stdio: ''inherit''}
);
Simplemente puede usar
.toString()
.
var result = require(''child_process'').execSync(''rsync -avAXz --info=progress2 "/src" "/dest"'').toString();
console.log(result);
Esto ha sido probado en el Nodo
v8.5.0
, no estoy seguro de las versiones anteriores.
De acuerdo con
@etov
, no funciona en
v6.3.1
- No estoy seguro sobre el intermedio.