node.js - выполнить команду синхронно и получить результат - PullRequest
7 голосов
/ 25 августа 2011

Я пытаюсь выполнить child_process синхронно в node.js (да, я знаю, что это плохо, у меня есть веская причина) и получить любой вывод на стандартный вывод, но я не могу понять, как ...

Я нашел этот пост SO: node.js выполняет системную команду синхронно , которая описывает, как использовать библиотеку (node-ffi) для выполнения команды, и это прекрасно работает, но единственное, что я ' Я могу получить это код завершения процесса. Любые данные, которые выполняет команда, отправляются непосредственно на стандартный вывод - как мне это перехватить?

> run('whoami')
username
0

другими словами, username - это echo'd для stdout, результат run - 0.

Я бы много скорее выяснил бы, как читать стандартный вывод

Ответы [ 5 ]

2 голосов
/ 25 августа 2011

Итак, у меня есть работающее решение, но оно мне не совсем нравится ... Просто отправьте сюда для справки:

Я использую библиотеку node-ffi, на которую есть ссылки в другом сообщении SO. У меня есть функция, которая:

  • принимает заданную команду
  • добавляет >> run-sync-output
  • выполняет его
  • читает run-sync-output синхронно и сохраняет результат
  • удаляет этот файл tmp
  • возвращает результат

Существует очевидная проблема, заключающаяся в том, что, если у пользователя нет прав на запись в текущий каталог, произойдет сбой. Плюс, это просто потраченные впустую усилия. : - /

1 голос
/ 28 февраля 2013

У меня была похожая проблема, и я написал расширение узла для этого. Вы можете проверить репозиторий git. Это с открытым исходным кодом и бесплатно, и все такое хорошее!

https://github.com/aponxi/npm-execxi

ExecXI - расширение узла, написанное на C ++ для выполнения команд оболочки один за другим выводит вывод команды на консоль в в режиме реального времени. Необязательные цепные и нецепные пути присутствуют; имея в виду что вы можете остановить скрипт после сбоя команды (прикован), или вы можете продолжить, как будто ничего не произошло!

Инструкции по использованию содержатся в файле ReadMe . Не стесняйтесь делать запросы или отправлять вопросы!

Однако он еще не возвращает стандартный вывод ... Ну, я только что выпустил его сегодня. Может быть, мы можем основываться на этом.

Во всяком случае, я думал, что стоит упомянуть об этом. Я также отправил это к подобному вопросу: node.js выполняет системную команду синхронно

1 голос
/ 23 сентября 2012

Я создал модуль node.js, который решает эту проблему. Проверьте это:)

Exec-план

Обновление

Вышеприведенный модуль решает вашу исходную проблему, потому что он позволяет синхронную цепочку дочерних процессов. Каждое звено в цепочке получает стандартный вывод из предыдущего процесса в цепочке.

0 голосов
/ 19 апреля 2019

Начиная с версии Node v0.11.12, для этого есть функция child_process.execSync.

0 голосов
/ 13 октября 2011

Кроме того, что написание кода немного отличается, на самом деле нет причин делать что-либо синхронизированное.

Что тебе не нравится в этом? ( документы )

var exec = require('child_process').exec;

exec('whoami', function (error, username) {
    console.log('stdout: %s', username);
    continueWithYourCode();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...