Wie führe ich ein externes Programm in Node.js aus?

137

Ist es möglich, ein externes Programm aus node.js heraus auszuführen? Gibt es eine Entsprechung zu Pythons os.system()oder einer Bibliothek, die diese Funktionalität hinzufügt?

Michael Bylstra
quelle
Sie möchten das child_processModul verwenden. In der Dokumentation finden Sie einige klare Beispiele für verschiedene Anwendungsfälle.
Ken Rockot

Antworten:

140
var exec = require('child_process').exec;
exec('pwd', function callback(error, stdout, stderr){
    // result
});
Mark Kahn
quelle
2
Was ist der beste Weg, um auf ein Ergebnis des untergeordneten Prozesses zu reagieren? Beispiel ... Wenn der Prozess einen Exit-Code 0 zurückgibt und ich eine andere Methode aufrufen möchte, stoße ich auf eine Vielzahl von Fehlern.
Continuousqa
@continuousqa - Diese Antwort ist 4 Jahre alt. Wenn Sie Probleme haben, stellen Sie bitte eine neue Frage auf SO und verweisen Sie gegebenenfalls auf diese.
Mark Kahn
1
Dieser Artikel enthält gute Tipps zur Verwendung child_process.
Adriano P
@ JoãoPimentelFerreira - Diese Frage ist 7 Jahre alt. Ich schlage vor, eine neue zu eröffnen, wenn Sie Hilfe benötigen
Mark Kahn
75

exec hat eine Speicherbeschränkung der Puffergröße von 512 KB. In diesem Fall ist es besser, Spawn zu verwenden. Mit Spawn hat man zur Laufzeit Zugriff auf stdout des ausgeführten Befehls

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
quelle
1
Ich habe diesen Code genommen und er zeigt nicht die Ausgabe des erzeugten
Paul Verest
1
@PaulVerest: Ihre Ausgabe war möglicherweise stderreher in als stdout. In meinem Fall kommt das closeaber nie ...
Hippietrail
1
was ist mit stdin? Ist es möglich, Daten an den Prozess zu senden?
Hernán Eche
18

Der einfachste Weg ist:

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

unref ist notwendig, um Ihren Prozess zu beenden, ohne auf "yourApp" zu warten.

Hier sind die Exec- Dokumente

zag2art
quelle