Como executar um programa externo no Node.js?

137

É possível executar um programa externo no node.js? Existe um equivalente ao Python os.system()ou a qualquer biblioteca que adicione essa funcionalidade?

Michael Bylstra
fonte
Você quer usar o child_processmódulo Consulte a documentação , que fornece vários exemplos claros de vários casos de uso.
precisa saber é o seguinte

Respostas:

140
var exec = require('child_process').exec;
exec('pwd', function callback(error, stdout, stderr){
    // result
});
Mark Kahn
fonte
2
Qual é a melhor maneira de agir com base no resultado do processo filho. Exemplo ... se o processo retornar um código de saída 0 e eu quiser chamar um método diferente, eu pareço encontrar uma infinidade de erros.
continuousqa
@continuousqa - Esta resposta tem 4 anos. Se você estiver tendo problemas, poste uma nova pergunta no SO e faça referência a esta, se necessário.
Mark Kahn #
1
Este artigo tem boas dicas de uso child_process.
Adriano P
@ JoãoPimentelFerreira - Esta pergunta tem 7 anos. Eu sugiro abrir um novo, se você precisa de ajuda
Mark Kahn
75

exec tem limitação de memória do tamanho do buffer de 512k. Nesse caso, é melhor usar a desova. Com spawn, é possível acessar stdout do comando executado em tempo de execução

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
fonte
1
Tomei este código e ele não consegue mostrar a saída de processo gerado stackoverflow.com/questions/21302350/...
Paul Verest
1
@PaulVerest: Sua saída pode ter sido em stderrvez de stdout. No meu caso, embora o closeé nunca mais ...
hippietrail
1
e quanto a stdin? é possível enviar dados para o processo?
Hernán Eche
18

A maneira mais simples é:

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

unref é necessário para finalizar seu processo sem aguardar "yourApp"

Aqui estão os documentos executivos

zag2art
fonte