2015-03-17 3 views
2

Я пишу простое (ish) приложение, которое позволяет внутренней системе на работе запросить процесс копирования (используя rsync) с удаленного сервера на другой удаленный сервер, инициированный используя вызов REST.Child_process, обрабатывающий поток STDOUT с возвратом каретки ( r)

Я уже достаточно хорошо знаком с выражением фреймворка и только что начал экспериментировать с библиотекой child_process и наткнулся на небольшую проблему.

Я успешно запускаю процессы rsync с использованием childProcess.spawn() узла, моя проблема в том, что rsync выводит свою строку выполнения с буферизацией с возвратом кавычки (\ r) вместо новой строки (\ n). В результате событие STDOUT, process.stdout.on('data', {}) вызывается только один раз, прежде чем сказать, что он устанавливает передачу, а затем после завершения копирования, поскольку данные STDOUT не сбрасываются при возврате каретки, поскольку обновления прогресса - только новая строка, когда работа заканчивается.

В последней версии rsync (3.1.0) есть переключатель для изменения окончаний выходного буфера на \ n вместо \ r, но, к сожалению, компания, с которой я работаю, не будет использовать эту версию в течение длительного времени ,

Я нерест и чтение child_process обычным способом ....

var doCopy = function (onFinish) { 
    var process = childProcess.spawn('ssh', [ 
     source.user + "@" + source.host, 
     "rsync", 
     "-avz", 
     "--progress", 
     source.path + source.file, 
     "-e ssh", 
     dest.user + "@" + dest.host + ":" + dest.path 
    ]); 

    process.on('error', function (error) { 
     console.log("ERR: " + error.code); 
    }) 

    process.stdout.on('data', function (data) { 
     console.log("OUT: " + data); 
    }); 

    process.stderr.on('data', function (data) { 
     console.log("ERR: " + data); 
    }); 

    process.on('close', function (code) { 
     console.log("FIN: " + code); 
     if(onFinish){ 
      onFinish(code); 
     } 
    }); 
} 

..и выход консоли ....

OUT: building file list ... 
OUT: 
1 file to consider 

OUT: test4.mp4 

     32,768 0% 0.00kB/s 0:00:00 
    169,738,240 32% 161.84MB/s 0:00:02 
    338,165,760 64% 161.32MB/s 0:00:01 
    504,692,736 96% 160.53MB/s 0:00:00 
    524,288,000 100% 160.35MB/s 0:00:03 (xfr#1, to-chk=0/1) 

OUT: 
sent 509,959 bytes received 46 bytes 113,334.44 bytes/sec 
total size is 524,288,000 speedup is 1,028.01 

FIN: 0 

Таким образом, вы можете видеть, что stdout.on ('data,) вызывается только тогда, когда rsync выводит новую строку (там, где есть «OUT:»).

Вопрос в том, могу ли я изменить это? Может быть, поместите поток через преобразование, чтобы сфотографироваться при возникновении \ r? Затем я могу повторно выделить строку и снова предложить обновление хода.

Если не считать этого, я полагаю, что мой единственный другой вариант - создать другой процесс для мониторинга растущего файла?

Любая помощь/совет очень ценится.

ответ

0

Я нашел this очень хороший модуль, который делает именно то, чего я пытался достичь. Позволяет мне ограничивать буфер stdout любым символом (в моем случае «\ r») и запускать новое событие stdout для обработки данных. Как ....

var splitter = process.stdout.pipe(StreamSplitter("\r")); 

splitter.on('token', function (data) { 
    console.log("OUT: " + data); 
}); 

splitter.on('done', function (data) { 
    console.log("DONE: " + data); 
}); 
Смежные вопросы