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