Come eseguire un programma esterno da Node.js?


137

È possibile eseguire un programma esterno dall'interno di node.js? Esiste un equivalente a Python os.system()o una libreria che aggiunge questa funzionalità?


Vuoi usare il child_processmodulo. Vedere la documentazione , che fornisce numerosi esempi chiari di vari casi d'uso.
Ken Rockot,

Risposte:


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

2
Qual è il modo migliore per agire su un risultato del processo figlio. Esempio ... se il processo restituisce un codice di uscita 0 e voglio chiamare un metodo diverso, mi sembra di imbattermi in una pletora di errori.
continuazione il

@continuousqa - Questa risposta ha 4 anni. In caso di problemi, si prega di inviare una nuova domanda su SO e fare riferimento a questa, se necessario.
Mark Kahn,

1
Questo articolo contiene buoni consigli sull'utilizzo child_process.
Adriano P,

@ JoãoPimentelFerreira - Questa domanda ha 7 anni. Suggerisco di aprirne uno nuovo se hai bisogno di aiuto
Mark Kahn,

75

exec ha una limitazione di memoria della dimensione del buffer di 512k. In questo caso è meglio usare spawn. Con spawn si ha accesso allo stdout del comando eseguito in fase di esecuzione

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
Ho preso questo codice e non riesce a visualizzare l'output di processo generato stackoverflow.com/questions/21302350/...
Paul Verest

1
@PaulVerest: l'output potrebbe essere stato presente stderranziché stdout. Nel mio caso, però, closenon arriverà mai ...
hippietrail,

1
che dire di stdin? è possibile inviare dati al processo?
Hernán Eche,

18

Il modo più semplice è:

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

unref è necessario per terminare il processo senza attendere "yourApp"

Ecco i documenti di exec


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.