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?


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
});

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);
});

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.