¿Cómo ejecutar un programa externo desde Node.js?

137

¿Es posible ejecutar un programa externo desde node.js? ¿Hay un equivalente a Python os.system()o alguna biblioteca que agregue esta funcionalidad?

Michael Bylstra
fuente
Quieres usar el child_processmódulo. Consulte la documentación , que proporciona varios ejemplos claros de varios casos de uso.
Ken Rockot

Respuestas:

140
var exec = require('child_process').exec;
exec('pwd', function callback(error, stdout, stderr){
    // result
});
Mark Kahn
fuente
2
¿Cuál es la mejor manera de actuar en función del resultado del proceso secundario? Ejemplo ... si el proceso devuelve un código de salida 0, y quiero llamar a un método diferente, parece que me encuentro con una gran cantidad de errores.
continuousqa
@continuousqa: esta respuesta tiene 4 años. Si tiene problemas, publique una nueva pregunta en SO y haga referencia a esta si es necesario.
Mark Kahn
1
Este artículo tiene buenos consejos sobre el uso child_process.
Adriano P
@ JoãoPimentelFerreira - Esta pregunta tiene 7 años. Sugiero abrir uno nuevo si necesita ayuda
Mark Kahn
75

exec tiene una limitación de memoria del tamaño del búfer de 512k. En este caso, es mejor usar spawn. Con spawn uno tiene acceso a stdout del comando ejecutado en tiempo de ejecución

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
fuente
1
Tomé este código y no muestra la salida del proceso generado stackoverflow.com/questions/21302350/…
Paul Verest
1
@PaulVerest: Su salida puede haber estado en stderrlugar de stdout. En mi caso, aunque closenunca llegará ...
hippietrail
1
¿Qué pasa con stdin? ¿Es posible enviar datos al proceso?
Hernán Eche
18

La forma más simple es:

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

Unref es necesario para finalizar su proceso sin esperar "yourApp"

Aquí están los documentos ejecutivos

zag2art
fuente