2017-02-12 2 views
0

i binden ist die Ausgabe eines Perl-Skript in Node.jsNode.js child.spawn stdout "live" in jeder Zeile

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

Dieses Skript zu verwenden, wird von der child_process.spawn Methode aufgerufen. Mein Problem ist, dass ich mit jedem einzelnen Ausgang arbeiten muss. Gibt es eine Möglichkeit, ein Event zu starten, sobald perl eine neue Zeile an stdout gesendet wird? In meinem eigentlichen Code kann ich die Ausgabe als Masse sehen, nachdem der Perl-Skript ausgeführt wird beendet und es ist nicht möglich, mit einzelnen Linien zu arbeiten

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); 
     } 
    }); 
} 

Antwort

1

Setzen Sie diese auf Ihrer Perl-Datei Pufferung auf Ausgang zu deaktivieren:

select(STDOUT); $| =1; 

Sie müssen auch Ihren 'Daten'-Handler reparieren, so dass Sie den lineBuffer var nicht verwalten, während Sie die Daten konsumieren. Um es zu beheben:

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); 
    } 
}); 

Auch gibt es eine fehlende stdout.setEncoding('utf8');?

+0

Vielen Dank! Es funktioniert wie es soll! setEncoding ging verloren, indem der Code komfortabler wurde. Eigentlich war es im ursprünglichen Code – DeZeT

Verwandte Themen