¡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:
- Clase: ChildProcess
- Evento: 'error'
- Evento: 'salir'
- Evento: 'cerrar'
- Evento: 'desconectar'
- Evento: 'mensaje'
También hay un montón de objetos de childObject , que son:
- Clase: ChildProcess
- child.stdin
- child.stdout
- child.stderr
- child.stdio
- child.pid
- niño.conectado
- child.kill ([señal])
- child.send (mensaje [, sendHandle] [, devolución de llamada])
- child.disconnect ()
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)
var spawn = require('child_process').spawn;
var child = spawn('node ./commands/server.js');
// You can also use a variable to save the output
// for when the script closes later
var scriptOutput = "";
child.stdout.setEncoding('utf8');
child.stdout.on('data', function(data) {
//Here is where the output goes
console.log('stdout: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.stderr.setEncoding('utf8');
child.stderr.on('data', function(data) {
//Here is where the error output goes
console.log('stderr: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.on('close', function(code) {
//Here you can get the exit code of the script
console.log('closing code: ' + code);
console.log('Full output of script: ',scriptOutput);
});
Así es como usaría un método callback + asincrónico :
var child_process = require('child_process');
console.log("Node Version: ", process.version);
run_script("ls", ["-l", "/home"], function(output, exit_code) {
console.log("Process Finished.");
console.log('closing code: ' + exit_code);
console.log('Full output of script: ',output);
});
console.log ("Continuing to do node things while the process runs at the same time...");
// This function will output the lines from the script
// AS is runs, AND will return the full combined output
// as well as exit code when it's done (using the callback).
function run_script(command, args, callback) {
console.log("Starting Process.");
var child = child_process.spawn(command, args);
var scriptOutput = "";
child.stdout.setEncoding('utf8');
child.stdout.on('data', function(data) {
console.log('stdout: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.stderr.setEncoding('utf8');
child.stderr.on('data', function(data) {
console.log('stderr: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.on('close', function(code) {
callback(scriptOutput,code);
});
}
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:
- Si la secuencia de comandos tarda un poco en completarse, su servidor se bloqueará durante ese tiempo.
- La salida estándar solo se devolverá una vez que el script haya terminado de ejecutarse . Debido a que es síncrono, no puede continuar hasta que finalice la línea actual. Por lo tanto, no puede capturar el evento 'stdout' hasta que la línea de generación haya terminado.
Cómo usarlo:
var child_process = require('child_process');
var child = child_process.spawnSync("ls", ["-l", "/home"], { encoding : 'utf8' });
console.log("Process finished.");
if(child.error) {
console.log("ERROR: ",child.error);
}
console.log("stdout: ",child.stdout);
console.log("stderr: ",child.stderr);
console.log("exist code: ",child.status);
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/906265