Pour une version encore plus récente de Node.js (v8.1.4), les événements et les appels sont similaires ou identiques aux versions antérieures, mais il est encouragé d'utiliser les fonctionnalités de langage plus récentes standard. Exemples:
Pour une sortie mise en mémoire tampon et non formatée (vous obtenez tout cela en même temps), utilisez child_process.exec
:
const { exec } = require('child_process');
exec('cat *.js bad_file | wc -l', (err, stdout, stderr) => {
if (err) {
// node couldn't execute the command
return;
}
// the *entire* stdout and stderr (buffered)
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});
Vous pouvez également l'utiliser avec Promises:
const util = require('util');
const exec = util.promisify(require('child_process').exec);
async function ls() {
const { stdout, stderr } = await exec('ls');
console.log('stdout:', stdout);
console.log('stderr:', stderr);
}
ls();
Si vous souhaitez recevoir les données progressivement en morceaux (sortie sous forme de flux), utilisez child_process.spawn
:
const { spawn } = require('child_process');
const child = spawn('ls', ['-lh', '/usr']);
// use child.stdout.setEncoding('utf8'); if you want text chunks
child.stdout.on('data', (chunk) => {
// data from standard output is here as buffers
});
// since these are streams, you can pipe them elsewhere
child.stderr.pipe(dest);
child.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
Ces deux fonctions ont une contrepartie synchrone. Un exemple pour child_process.execSync
:
const { execSync } = require('child_process');
// stderr is sent to stderr of parent process
// you can set options.stdio if you want it to go elsewhere
let stdout = execSync('ls');
Ainsi que child_process.spawnSync
:
const { spawnSync} = require('child_process');
const child = spawnSync('ls', ['-lh', '/usr']);
console.log('error', child.error);
console.log('stdout ', child.stdout);
console.log('stderr ', child.stderr);
Remarque: Le code suivant est toujours fonctionnel, mais s'adresse principalement aux utilisateurs d'ES5 et versions antérieures.
Le module de génération de processus enfants avec Node.js est bien documenté dans la documentation (v5.0.0). Pour exécuter une commande et récupérer sa sortie complète sous forme de tampon, utilisezchild_process.exec
:
var exec = require('child_process').exec;
var cmd = 'prince -v builds/pdf/book.html -o builds/pdf/book.pdf';
exec(cmd, function(error, stdout, stderr) {
// command output is in stdout
});
Si vous devez utiliser la gestion des E / S de processus avec des flux, par exemple lorsque vous attendez de grandes quantités de sortie, utilisez child_process.spawn
:
var spawn = require('child_process').spawn;
var child = spawn('prince', [
'-v', 'builds/pdf/book.html',
'-o', 'builds/pdf/book.pdf'
]);
child.stdout.on('data', function(chunk) {
// output will be here in chunks
});
// or if you want to send output elsewhere
child.stdout.pipe(dest);
Si vous exécutez un fichier plutôt qu'une commande, vous voudrez peut-être utiliser des child_process.execFile
paramètres qui sont presque identiques à spawn
, mais qui ont un quatrième paramètre de rappel comme exec
pour récupérer les tampons de sortie. Cela pourrait ressembler un peu à ceci:
var execFile = require('child_process').execFile;
execFile(file, args, options, function(error, stdout, stderr) {
// command output is in stdout
});
Depuis la v0.11.12 , Node prend désormais en charge les modes synchrone spawn
et exec
. Toutes les méthodes décrites ci-dessus sont asynchrones et ont une contrepartie synchrone. La documentation pour eux peut être trouvée ici . Bien qu'elles soient utiles pour les scripts, notez que contrairement aux méthodes utilisées pour générer des processus enfants de manière asynchrone, les méthodes synchrones ne renvoient pas d'instance de ChildProcess
.