È molto più facile ora (6 anni dopo)!
Spawn restituisce un childObject , con il quale puoi quindi ascoltare gli eventi . Gli eventi sono:
- Classe: ChildProcess
- Evento: "errore"
- Evento: "uscita"
- Evento: "chiudi"
- Evento: "disconnect"
- Evento: "messaggio"
Ci sono anche un sacco di oggetti da childObject , sono:
- Classe: ChildProcess
- child.stdin
- child.stdout
- child.stderr
- child.stdio
- child.pid
- child.connected
- child.kill ([segnale])
- child.send (messaggio [, sendHandle] [, callback])
- child.disconnect ()
Ulteriori informazioni su childObject sono disponibili qui: https://nodejs.org/api/child_process.html
asincrono
Se desideri eseguire il processo in background mentre il nodo è ancora in grado di continuare a essere eseguito, utilizza il metodo asincrono. È comunque possibile scegliere di eseguire azioni dopo il completamento del processo e quando il processo ha un output (ad esempio se si desidera inviare l'output di uno script al client).
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);
});
Ecco come useresti un callback + metodo asincrono :
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);
});
}
Utilizzando il metodo sopra, è possibile inviare ogni riga di output dallo script al client (ad esempio utilizzando Socket.io per inviare ogni riga quando si ricevono eventi su stdout
ostderr
).
Sincrono
Se vuoi che il nodo interrompa ciò che sta facendo e attendi fino al completamento dello script , puoi utilizzare la versione sincrona:
child_process.spawnSync (...);(Nodo v0.11.12 +)
Problemi con questo metodo:
- Se il completamento dello script richiede un po 'di tempo, il tuo server si bloccherà per quel lasso di tempo!
- Lo stdout verrà restituito solo al termine dell'esecuzione dello script . Poiché è sincrono, non può continuare fino al termine della riga corrente. Pertanto non è in grado di catturare l'evento "stdout" finché la linea di spawn non è terminata.
Come 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
, non dimenticare di passare il-u
flag per non bufferizzare l'output della console, altrimenti sembrerà che lo script non sia live stackoverflow.com/a/49947671/906265