2017-02-12 11 views
0

я обвязки использовать вывод скрипта Perl в Node.jsNode.js child.spawn стандартный вывод «вживую» в каждой строке

for (my $i=10;$i<100 ;$i+=30) 
{ 
    printf "$i\n"; 
    sleep(1); 
} 

Этот скрипт вызывается методом child_process.spawn. Моя проблема в том, что мне нужно работать с каждым выходом. Есть ли способ запустить событие, как только perl отправить новую строку в stdout? В моем фактическом коде я могу увидеть результат как сыпучие после того, как сценарий Perl закончит работу, и это не возможно работать с одиночными линиями

function setStuff() { 
    var command = "perl"; 
    var scriptpath = "script.pl"; 
    var arg = [scriptpath]; 
    run(command, arg); 
} 
function run(cmd, arg) { 
var spawn = require('child_process').spawn; 
    var command = spawn(cmd, arg, {detached: true, stdout: 'pipe'}); 

    command.unref(); 
    var lineBuffer = ""; 
    command.stdout.pipe(process.stdout); 
    command.stdout.on('data', function (data) { 
     lineBuffer += data.toString(); 
     var lines = lineBuffer.split("\n"); 
     for (var i = 0; i < lines.length - 1; i++) { 
      var line = lines[i]; 
      console.log(line); 
     } 
    }); 
} 

ответ

1

Наденьте это файл PERL, чтобы отключить буферизацию на выходе:

select(STDOUT); $| =1; 

Вам также нужно исправить свой обработчик данных, чтобы вы не управляли переменным lineBuffer var при потреблении данных. Чтобы это исправить:

command.stdout.on('data', function (data) { 
    var lines = (lineBuffer + data).split("\n"); 
    if(data[data.length-1] != '\n') { 
     lineBuffer = lines.pop(); 
    }else{ 
     lineBuffer = ''; 
    } 
    for (var i = 0; i < lines.length - 1; i++) { 
     var line = lines[i]; 
     console.log(line); 
    } 
}); 

Кроме того, есть недостающий stdout.setEncoding('utf8');?

+0

Спасибо! Он работает так, как должен! setEncoding потерялся, сделав код более удобным. На самом деле это было в исходном коде – DeZeT