2012-05-29 6 views
1

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

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

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

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

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

+0

Я нашел способ открыть новое окно консоли через exec (spawn не работает), поставив «start» перед моей командой. Однако выполнение этого прерывает выходной буфер дочернего процесса. Возможно, я запустил новый экземпляр узла в новом окне для связи с экземпляром узла, который инициировал загрузку. Узел, похоже, не предназначен для поддержки нескольких окон консоли или управления окнами каким-либо образом (в отличие от WSH). – Eric

ответ

1

Вы можете использовать узел-прогресс и HTTP узла клиента (или запрос) для этого, нет необходимости в 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(); 

UPDATE:

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

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

Ресурсы:

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

+0

Спасибо! Но я думаю, это оставило бы меня с проблемой, что нет видимого окна для отображения прогресса, поскольку фоновый процесс выполняется в скрытой консоли. – Eric

+0

Я обновил свой ответ. – alessioalex

+0

Спасибо. Я надеялся сделать это только через узел, но Node слишком ограничен, чтобы делать что-то вроде открытия нескольких окон. Я закончил запуск второго экземпляра узла с его собственным окном. Там я попробую некоторые из предложенных вами вещей (используя HTTP-клиент Node вместо WGET и связывается с экземпляром другого узла через порт TCP). – Eric