C'est beaucoup plus facile maintenant (6 ans plus tard)!
Spawn renvoie un childObject , avec lequel vous pouvez ensuite écouter les événements . Les événements sont:
- Classe: ChildProcess
- Événement: 'erreur'
- Événement: 'exit'
- Événement: 'fermer'
- Événement: 'déconnecter'
- Événement: 'message'
Il existe également un tas d' objets de childObject , ce sont:
- Classe: ChildProcess
- enfant.stdin
- child.stdout
- child.stderr
- child.stdio
- child.pid
- enfant.connecté
- child.kill ([signal])
- child.send (message [, sendHandle] [, rappel])
- child.disconnect ()
Voir plus d'informations ici sur childObject: https://nodejs.org/api/child_process.html
Asynchrone
Si vous souhaitez exécuter votre processus en arrière-plan pendant que le nœud est toujours en mesure de continuer à s'exécuter, utilisez la méthode asynchrone. Vous pouvez toujours choisir d'effectuer des actions une fois votre processus terminé et lorsque le processus a une sortie (par exemple, si vous souhaitez envoyer la sortie d'un script au client).
child_process.spawn (...); (Nœud 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);
});
Voici comment vous utiliseriez une méthode de rappel + asynchrone :
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);
});
}
En utilisant la méthode ci-dessus, vous pouvez envoyer chaque ligne de sortie du script au client (par exemple en utilisant Socket.io pour envoyer chaque ligne lorsque vous recevez des événements sur stdout
ou stderr
).
Synchrone
Si vous voulez que node arrête ce qu'il fait et attend que le script se termine , vous pouvez utiliser la version synchrone:
child_process.spawnSync (...); (Nœud v0.11.12 +)
Problèmes avec cette méthode:
- Si le script prend un certain temps à se terminer, votre serveur se bloquera pendant ce laps de temps!
- Le stdout ne sera retourné qu'une fois le script terminé . Comme il est synchrone, il ne peut pas continuer tant que la ligne actuelle n'est pas terminée. Par conséquent, il ne peut pas capturer l'événement 'stdout' tant que la ligne de spawn n'est pas terminée.
Comment l'utiliser:
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
n'oubliez pas de passer le-u
drapeau pour qu'il ne tamponne pas la sortie de la console, sinon il semblera que le script n'est pas en direct stackoverflow.com/a/49947671/906265