Comment exécuter un programme externe à partir de Node.js?

137

Est-il possible d'exécuter un programme externe à partir de node.js? Existe-t-il un équivalent de Python os.system()ou de toute bibliothèque qui ajoute cette fonctionnalité?

Michael Bylstra
la source
Vous souhaitez utiliser le child_processmodule. Consultez la documentation , qui fournit plusieurs exemples clairs de divers cas d'utilisation.
Ken Rockot

Réponses:

140
var exec = require('child_process').exec;
exec('pwd', function callback(error, stdout, stderr){
    // result
});
Mark Kahn
la source
2
Quelle est la meilleure façon d'agir sur un résultat du processus de l' enfant. Exemple ... si le processus renvoie un code de sortie 0 et que je souhaite appeler une méthode différente, il me semble que je rencontre une pléthore d'erreurs.
continuousqa
@continuousqa - Cette réponse a 4 ans. Si vous rencontrez des problèmes, postez une nouvelle question sur SO et référencez-la si nécessaire.
Mark Kahn
1
Cet article contient de bons conseils d'utilisation child_process.
Adriano P
@ JoãoPimentelFerreira - Cette question a 7 ans. Je suggère d'en ouvrir un nouveau si vous avez besoin d'aide
Mark Kahn
75

exec a une limitation de mémoire de la taille de la mémoire tampon de 512k. Dans ce cas, il est préférable d'utiliser spawn. Avec un spawn a accès à stdout de commande exécutée au moment de l'exécution

var spawn = require('child_process').spawn;
var prc = spawn('java',  ['-jar', '-Xmx512M', '-Dfile.encoding=utf8', 'script/importlistings.jar']);

//noinspection JSUnresolvedFunction
prc.stdout.setEncoding('utf8');
prc.stdout.on('data', function (data) {
    var str = data.toString()
    var lines = str.split(/(\r?\n)/g);
    console.log(lines.join(""));
});

prc.on('close', function (code) {
    console.log('process exit code ' + code);
});
MKK
la source
1
J'ai pris ce code et il ne parvient pas à afficher la sortie du processus généré stackoverflow.com/questions/21302350/...
Paul Verest
1
@PaulVerest: Votre sortie a peut - être été stderrplutôt que stdout. Dans mon cas, mais le closene vient jamais ...
hippietrail
1
qu'en est-il de stdin? est-il possible d'envoyer des données au processus?
Hernán Eche
18

Le moyen le plus simple est:

const {exec} = require("child_process")
exec('yourApp').unref()

UNREF est nécessaire de mettre fin à votre processus sans attendre « YourApp »

Voici les exec docs

zag2art
la source