簡體   English   中英

每行上的Node.js child.spawn標准輸出“實時”

[英]Node.js child.spawn stdout “live” at every line

我想在Node.js中使用Perl腳本的輸出

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

將其放在您的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');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM