Я пишу простое (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? Затем я могу повторно выделить строку и снова предложить обновление хода.
Если не считать этого, я полагаю, что мой единственный другой вариант - создать другой процесс для мониторинга растущего файла?
Любая помощь/совет очень ценится.