Как выполнить внешнюю программу из Node.js?

137

Можно ли выполнить внешнюю программу из node.js? Есть ли эквивалент Python os.system()или какой-либо библиотеки, которая добавляет эту функциональность?

Майкл Билстра
источник
Вы хотите использовать child_processмодуль. См. Документацию , которая содержит несколько наглядных примеров различных вариантов использования.
Кен Рокот

Ответы:

140
var exec = require('child_process').exec;
exec('pwd', function callback(error, stdout, stderr){
    // result
});
Марк Кан
источник
2
Как лучше всего действовать в результате дочернего процесса. Пример ... если процесс возвращает код выхода 0, и я хочу вызвать другой метод, я, кажется, сталкиваюсь с множеством ошибок.
continuousqa
@continuousqa - этому ответу 4 года. Если у вас возникли проблемы, пожалуйста, опубликуйте новый вопрос на SO и, если необходимо, укажите этот вопрос.
Марк Кан
1
Эта статья имеет хорошие советы по использованию child_process.
Адриано П
@ JoãoPimentelFerreira - этому вопросу 7 лет. Я предлагаю открыть новый, если вам нужна помощь
Марк Кан
75

exec имеет ограничение памяти размера буфера 512k. В этом случае лучше использовать spawn. С помощью spawn можно получить доступ к стандартному выводу выполненной команды во время выполнения.

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
источник
1
Я взял этот код, и он не показывает вывод порожденного процесса stackoverflow.com/questions/21302350/…
Пол Верест
1
@PaulVerest: Ваш вывод, возможно, был, stderrа не stdout. В моем случае closeэто никогда не
наступит
1
что насчет стандартного ввода? Можно ли отправить данные в процесс?
Эрнан Эче
18

Самый простой способ:

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

unref необходимо завершить процесс, не дожидаясь «yourApp»

Вот исполнительные документы

zag2art
источник