Recherche…


Syntaxe

  • child_process.exec (commande [, options] [, callback])
  • child_process.execFile (fichier [, args] [, options] [, callback])
  • child_process.fork (modulePath [, args] [, options])
  • child_process.spawn (commande [, args] [, options])
  • child_process.execFileSync (fichier [, args] [, options])
  • child_process.execSync (commande [, options])
  • child_process.spawnSync (commande [, args] [, options])

Remarques

Lorsque vous traitez des processus enfants, toutes les méthodes asynchrones ChildProcess une instance de ChildProcess , alors que toutes les versions synchrones ChildProcess la sortie de tout ce qui a été exécuté. Comme d'autres opérations synchrones dans Node.js, si une erreur survient, elle sera lancée.

Création d'un nouveau processus pour exécuter une commande

Pour générer un nouveau processus dans lequel vous avez besoin d'une sortie sans tampon (par exemple, des processus de longue durée qui peuvent imprimer des résultats sur une child_process.spawn() période plutôt que d'imprimer et de quitter immédiatement), utilisez child_process.spawn() .

Cette méthode génère un nouveau processus en utilisant une commande donnée et un tableau d'arguments. La valeur de retour est une instance de ChildProcess , qui à son tour fournit les propriétés stdout et stderr . Ces deux flux sont des instances de stream.Readable .

Le code suivant est équivalent à l'utilisation de la commande ls -lh /usr .

const spawn = require('child_process').spawn;
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

Un autre exemple de commande:

zip -0vr "archive" ./image.png

Peut-être écrit comme:

spawn('zip', ['-0vr', '"archive"', './image.png']);

Création d'un shell pour exécuter une commande

Pour exécuter une commande dans un shell dans lequel vous avez besoin d'une sortie en mémoire tampon (c'est-à-dire que ce n'est pas un flux), utilisez child_process.exec . Par exemple, si vous souhaitez exécuter la commande cat *.js file | wc -l , sans options, cela ressemblerait à ceci:

const exec = require('child_process').exec;
exec('cat *.js file | wc -l', (err, stdout, stderr) => {
  if (err) {
    console.error(`exec error: ${err}`);
    return;
  }

  console.log(`stdout: ${stdout}`);
  console.log(`stderr: ${stderr}`);
});

La fonction accepte jusqu'à trois paramètres:

child_process.exec(command[, options][, callback]);

Le paramètre de commande est une chaîne et est requis, tandis que l'objet options et le rappel sont tous deux facultatifs. Si aucun objet d'options n'est spécifié, alors exec utilise par défaut ce qui suit:

{
  encoding: 'utf8',
  timeout: 0,
  maxBuffer: 200*1024,
  killSignal: 'SIGTERM',
  cwd: null,
  env: null
}

L'objet options prend également en charge un paramètre shell , par défaut /bin/sh sous UNIX et cmd.exe sous Windows, une option uid permettant de définir l'identité utilisateur du processus et une option gid pour l'identité du groupe.

Le rappel, appelé lors de l'exécution de la commande, est appelé avec les trois arguments (err, stdout, stderr) . Si la commande s'exécute avec succès, err sera null , sinon ce sera une instance de Error , err.code étant le code de sortie du processus et err.signal étant le signal envoyé pour le terminer.

Les arguments stdout et stderr sont la sortie de la commande. Il est décodé avec le codage spécifié dans l'objet options (default: string ), mais peut être renvoyé sous forme d'objet Buffer .

Il existe également une version synchrone de exec , qui est execSync . La version synchrone ne prend pas de rappel et renverra stdout au lieu d'une instance de ChildProcess . Si la version synchrone rencontre une erreur, elle lancera et arrêtera votre programme. Cela ressemble à ceci:

const execSync = require('child_process').execSync;
const stdout = execSync('cat *.js file | wc -l');
console.log(`stdout: ${stdout}`);

Création d'un processus pour exécuter un exécutable

Si vous souhaitez exécuter un fichier, tel qu'un exécutable, utilisez child_process.execFile . Au lieu de créer un shell comme pourrait le faire child_process.exec , cela créera directement un nouveau processus, ce qui est légèrement plus efficace que d'exécuter une commande. La fonction peut être utilisée comme ceci:

const execFile = require('child_process').execFile;
const child = execFile('node', ['--version'], (err, stdout, stderr) => {
  if (err) {
    throw err;
  }

  console.log(stdout);
});

Contrairement à child_process.exec , cette fonction accepte jusqu'à quatre paramètres, le second paramètre étant un tableau d'arguments que vous souhaitez fournir à l'exécutable:

child_process.execFile(file[, args][, options][, callback]);

Sinon, les options et le format de rappel sont identiques à child_process.exec . Il en va de même pour la version synchrone de la fonction:

const execFileSync = require('child_process').execFileSync;
const stdout = execFileSync('node', ['--version']);
console.log(stdout);


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow