2016-01-06 58 views
2

我正在嘗試寫一個代表我的項目中的其他腳本代理的小命令腳本,我試圖使用節點將stdout從派生進程管道傳輸到當前進程的stdout:增加nodejs管道的最大字節大小

function runCommand(command, arguments) { 
    var commandProcess = childProcess.spawn(command, arguments); 
    commandProcess.stdout.pipe(process.stdout); 
    commandProcess.on("exit", process.exit); 
} 

,直到我開始得到從我的子進程的大輸出這工作正常(例如其中之一是Maven的命令)。我所看到的只是輸出標準輸出的前8192個字節,然後將剩下的內容存儲到下一個「數據」事件中。然後打印出下一個8192等。這意味着輸出存在滯後,並且有時在我們運行服務器進程時,有時它會停止打印出來,直到您觸發服務器上觸發另一個「數據」事件的事件。

有沒有辦法增加這個緩衝區的大小或避免這種行爲?理想情況下,這個指揮官腳本只是代理我們的其他腳本,並應按原樣打印所有內容。

回答

0

您正在使用節點進程spawn,它是異步異步的,因此它會在子進程給出stdout時給出輸出。 編號:https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options][1]

我建議使用子進程exec來運行你的過程,你可以控制輸出緩衝區的大小,後子進程finished.This這將給輸出如何通過緩衝區大小

var execute = function(command, callback){ 
    exec(command, {maxBuffer: 1024 * 500}, function(error, stdout, stderr){ callback(error, stdout); }); 
}; 
+0

謝謝!我會看看這是否適用於我所需要的。我之所以沒有嘗試這個原因是因爲大量的數據被打印到'stdout'。理想情況下,我希望緩衝區大小爲'無限',並且只需打印輸出內容即可,我認爲這是'.pipe'的功能。 –

+0

實際上我們不能使用'exec',因爲這是一個服務器命令(即一個進程在你手動告訴它之前不會退出),我們實際上希望它是異步異步的。它看起來像'spawned'進程有一個8192字節的硬編碼限制,我需要解決這個問題。 –