Jak uruchomić zewnętrzny program z poziomu Node.js?


137

Czy można wykonać zewnętrzny program z poziomu node.js? Czy istnieje odpowiednik Pythona os.system()lub jakiejkolwiek innej biblioteki, która dodaje tę funkcjonalność?


Chcesz skorzystać z child_processmodułu. Zobacz dokumentację , która zawiera kilka jasnych przykładów różnych przypadków użycia.
Ken Rockot,

Odpowiedzi:


140
var exec = require('child_process').exec;
exec('pwd', function callback(error, stdout, stderr){
    // result
});

2
Jaki jest najlepszy sposób działania na wynik procesu dziecka. Przykład ... jeśli proces zwraca kod zakończenia 0, a chcę wywołać inną metodę, wydaje mi się, że napotykam mnóstwo błędów.
Continuousqa

@continuousqa - ta odpowiedź ma 4 lata. Jeśli masz problemy, zadaj nowe pytanie na SO i odnieś się do tego, jeśli to konieczne.
Mark Kahn

1
Ten artykuł zawiera dobre wskazówki dotyczące używania child_process.
Adriano P

@ JoãoPimentelFerreira - to pytanie ma 7 lat. Proponuję otworzyć nowy, jeśli potrzebujesz pomocy
Mark Kahn

75

exec ma ograniczenie pamięci o rozmiarze bufora 512k. W takim przypadku lepiej jest użyć spawnu. Przy spawn masz dostęp do standardowego wyjścia wykonywanego polecenia w czasie wykonywania

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
Wziąłem ten kod i nie wyświetla danych wyjściowych
zwołanego

1
@PaulVerest: Twoje wyniki mogły być stderrraczej w formacie stdout. W moim przypadku to jednak closenigdy nie nadejdzie ...
hippietrail

1
a co ze stdinem? czy można przesłać dane do procesu?
Hernán Eche

18

Najprostszy sposób to:

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

unref jest konieczne, aby zakończyć proces bez czekania na „yourApp”

Oto dokumentacja exec


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.