У меня есть сценарий, который выводит «привет», спит на секунду, выводит «привет», спит на 1 секунду и так далее и так далее. Теперь я подумал, что смогу решить эту проблему с помощью этой модели.
var spawn = require('child_process').spawn,
temp = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR');
temp.stdout.pipe(process.stdout);
Теперь проблема в том, что задача должна быть завершена, чтобы вывод был отображен. Насколько я понимаю, это связано с тем, что вновь созданный процесс берет на себя управление выполнением. Очевидно, node.js не поддерживает потоки, поэтому какие-либо решения? Моя идея заключалась в том, чтобы, возможно, запустить два экземпляра, первый для конкретной цели создания задачи и передать вывод в процесс второго экземпляра, учитывая, что это может быть достигнуто.
node.js
spawn
capture-output
точка фокусировки
источник
источник
python
, не забудьте передать-u
флаг, чтобы он не буферизовал вывод консоли, иначе он будет выглядеть так, как будто скрипт не работает stackoverflow.com/a/49947671/906265Ответы:
Я все еще пытаюсь освоить Node.js, но у меня есть несколько идей. Во-первых, я считаю, что вам нужно использовать
execFile
вместоspawn
;execFile
предназначен для случаев, когда у вас есть путь к сценарию, тогдаspawn
как для выполнения хорошо известной команды, которую Node.js может разрешить для вашего системного пути.1. Обеспечьте обратный вызов для обработки буферизованного вывода:
2. Добавьте слушателя в поток stdout дочернего процесса ( 9thport.net ).
Кроме того, есть варианты, с помощью которых вы можете отсоединить порожденный процесс от управляющего терминала Node, что позволит ему работать асинхронно. Я еще не тестировал это, но в документации API есть примеры, которые выглядят примерно так:
источник
child.spawn()
если дляshell
параметра установлено значениеtrue
. nodejs.org/api/…child.stdout.pipe(process.stdout);
javascript let childProcess = exec ( './script-to-run --arg1 arg1value', ( error, stdout, stderror ) => { console.log( '[CALLBACK]: ' + error ); // or stdout or stderror } ); // Same as with spawn: childProcess.stdout.on ( 'data', ( data ) => { console.log( '[LIVE]: ' + data ); // Here's your live data! } );
Сейчас (6 лет спустя) все намного проще!
Spawn возвращает childObject , с помощью которого вы затем можете прослушивать события . События:
Также есть набор объектов из childObject , это:
См. Дополнительную информацию о childObject здесь: https://nodejs.org/api/child_process.html
Асинхронный
Если вы хотите запустить процесс в фоновом режиме, в то время как узел все еще может продолжать выполнение, используйте асинхронный метод. Вы по-прежнему можете выполнять действия после завершения процесса и когда у процесса есть какие-либо выходные данные (например, если вы хотите отправить выходные данные сценария клиенту).
child_process.spawn (...); (Узел v0.1.90)
Вот как вы могли бы использовать асинхронный метод обратного вызова :
Используя описанный выше метод, вы можете отправлять каждую строку вывода из сценария клиенту (например, используя Socket.io для отправки каждой строки при получении событий на
stdout
илиstderr
).Синхронный
Если вы хотите, чтобы node прекратил свои действия и дождался завершения скрипта , вы можете использовать синхронную версию:
child_process.spawnSync (...); (Узел v0.11.12 +)
Проблемы с этим методом:
Как это использовать:
источник
child.stdout.setEncoding('utf8')
если хотите, чтобы вводились строки utf8.stdout
асинхронного режима, то есть пока остающаяся программа продолжает работу, если процесс продолжается.console.log("Output 1"); console.error("Boom"); console.log("Output 2");
а я делаюspawnAsync('node ./script.js')
... как сохранить порядок вывода? Кажется, что мой вывод всегда выходит в неправильном порядке.pipe
илиpipeline
или передадите соответствующие параметры вspawn
.Вот самый чистый подход, который я нашел:
источник
У меня были небольшие проблемы с получением вывода журнала из команды "npm install", когда я создал npm в дочернем процессе. В родительской консоли не отображалось ведение журнала зависимостей в реальном времени.
Самый простой способ сделать то, что хочет исходный плакат, выглядит следующим образом (создать npm в Windows и записать все в родительскую консоль):
источник
Я обнаружил, что мне достаточно часто требуется эта функция, поэтому я упаковал ее в библиотеку под названием std-pour . Он должен позволить вам выполнить команду и просмотреть результат в реальном времени. Для простой установки:
Тогда достаточно просто выполнить команду и увидеть результат в реальном времени:
Это обещано на основе, поэтому вы можете связать несколько команд. Он даже совместим с функциональной сигнатурой,
child_process.spawn
поэтому он должен быть заменой везде, где вы его используете.источник
PHP-подобный passthru
использование
источник
ребенок:
родитель:
источник
Добавление ответа, связанного с тем,
child_process.exec
что мне тоже нужна была обратная связь в реальном времени, и я не получал ее до завершения сценария. Это также дополняет мой комментарий к принятому ответу, но по мере его форматирования он будет немного более понятным и легким для чтения.По сути, у меня есть сценарий npm, который вызывает Gulp, вызывая задачу, которая впоследствии используется
child_process.exec
для выполнения сценария bash или пакетной обработки в зависимости от ОС. Любой сценарий запускает процесс сборки через Gulp, а затем выполняет несколько вызовов некоторых двоичных файлов, которые работают с выходными данными Gulp.Это точно так же, как и другие (спавн и т. Д.), Но для завершения вот как это сделать:
Теперь это так же просто, как добавить прослушиватель событий. Для
stdout
:И для
stderr
:Совсем неплохо - HTH
источник