node.js: запустить внешнюю команду в новом окне

Я пишу скрипт node.js, который постоянно работает в фоновом режиме и время от времени инициирует загрузку файлов. Я хочу использовать WGET для загрузки файлов, поскольку он кажется более надежным, пока я действительно не узнаю, что я делаю с node.js.

Проблема в том, что я хочу видеть ход рассматриваемых загрузок. Но я не могу найти способ запустить WGET через node.js таким образом, чтобы новое окно оболочки открывалось и отображалось для WGET.

Функции exec и spawn узла запускают внешние команды в фоновом режиме и позволяют мне получить доступ к выходному потоку. Но поскольку мой скрипт работает в фоновом режиме (скрытом), я мало что могу сделать с выходным потоком.

Я попытался открыть новое окно оболочки, запустив "cmd /c wget...", но это не имело никакого значения.

Есть ли способ запускать внешние процессы командной строки в новом окне через node.js?


person Eric    schedule 29.05.2012    source источник
comment
Я нашел способ открыть новое окно консоли через exec (спаун не работает), поставив start перед моей командой. Однако при этом нарушается выходной буфер дочернего процесса. Возможно, я запущу новый экземпляр узла в новом окне для связи с экземпляром узла, который инициировал загрузку. Node, похоже, не предназначен для поддержки нескольких окон консоли или управления окнами каким-либо образом (в отличие от WSH).   -  person Eric    schedule 31.05.2012


Ответы (1)


Для этого вы можете использовать node-progress и http-клиент Node (или requesT), wget не нужен:

https://github.com/visionmedia/node-progress

Пример:

var ProgressBar = require('../')
  , https = require('https');

var req = https.request({
    host: 'download.github.com'
  , port: 443
  , path: '/visionmedia-node-jscoverage-0d4608a.zip'
});

req.on('response', function(res){
  var len = parseInt(res.headers['content-length'], 10);

  console.log();
  var bar = new ProgressBar('  downloading [:bar] :percent :etas', {
      complete: '='
    , incomplete: ' '
    , width: 20
    , total: len
  });

  res.on('data', function(chunk){
    bar.tick(chunk.length);
  });

  res.on('end', function(){
    console.log('\n');
  });
});

req.end();

ОБНОВИТЬ:

Поскольку вы хотите сделать это в фоновом процессе и прослушивать ход загрузки (в отдельном процессе или в том, что у вас есть), вы можете добиться этого, используя функциональность pub-sub, либо:

  • используйте очередь сообщений, такую ​​как Redis, RabbitMQ или ZeroMQ
  • запустите TCP-сервер на известном порту/домене UNIX и прослушайте его

Ресурсы:

http://nodejs.org/api/net.html

person alessioalex    schedule 29.05.2012
comment
Спасибо! Но я предполагаю, что это оставит меня с проблемой, что нет видимого окна для отображения прогресса, поскольку фоновый процесс выполняется в скрытой консоли. - person Eric; 29.05.2012
comment
Спасибо. Я надеялся сделать это только через узел, но узел слишком ограничен, чтобы делать такие вещи, как открытие нескольких окон. В итоге я запустил второй экземпляр Node с собственным окном. Там я попробую некоторые вещи, которые вы предложили (используя http-клиент Node вместо WGET и связываясь с другим экземпляром узла через TCP-порт). - person Eric; 31.05.2012