¿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?


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

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

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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.