2017-11-15 6 views
1

子プロセス出力ストリームのデータをより頻繁にフラッシュする方法はありますか?私は親の標準出力に子プロセスパイプに標準出力をしようとしています

import {exec} from 'child_process'; 

console.log(new Date() + " starting") 
const child = exec(/* some command */); 
child.stdout.pipe(process.stdout); 

これは動作しますが、子プロセスがパイプのバッファーのサイズに比べて非常にゆっくりとデータを生成します。データは頻繁ではなく、大きなチャンクになります。例えば

、私はこのような子の出力ストリーム見れば:

child.stdout.on('data', data => console.log(new Date(), data.length)); 

出力があるの

2017-11-15T21:53:44.128Z starting 
2017-11-15T21:53:58.319Z 8192 
2017-11-15T21:54:02.321Z 8192 
2017-11-15T21:54:07.384Z 8192 
2017-11-15T21:54:11.333Z 8192 
2017-11-15T21:54:15.281Z 8192 
2017-11-15T21:54:19.008Z 3967 

が使用小さいバッファまたはフラッシュを子出力ストリームを持ってする方法はありますさらに頻繁に?

+0

このコマンドでは、バッファをフラッシュする必要があります。通常、強制的に外部にフラッシュする方法はありません。 – tadman

+0

それは、子供ではなく、フラッシュする必要がある親です。 – RainingChain

+0

ストリームを手動でループで読み取るのは意味がありますか?私がそれを必要とするときに私にデータをアクセス可能にするでしょうか? –

答えて

2

OSと子プロセスは出力バッファリングを制御します。

たとえば、Pythonには-uオプションがあり、書き込みをフラッシュします(PYTHONUNBUFFEREDのenv var)。次の例は、バッファされていない出力と通常の出力を使用しているときに、1秒ごとに画面に整数を書き込むコマンドの動作の違いを示しています。

const {exec} = require('child_process') 

function run(cmd){ 
    return new Promise((resolve, reject) => { 
    console.log("%s starting %s", Date.now(), cmd) 
    const child = exec(cmd) 
    child.stdout.pipe(process.stdout) 
    child.stderr.pipe(process.stderr) 
    child.on('exit', exit => { 
     console.log('%s exit', Date.now(), exit) 
     if (exit === 0) return resolve(exit) 
     reject(new Error(exit)) 
    }) 
    }) 
} 

async function go(){ 
    await run('python -uc "import time; [print(i,str(time.sleep(1))) for i in range(10)]"') 
    await run('python -c "import time; [print(i,str(time.sleep(1))) for i in range(10)]"') 
} 

go() 

実行中の子プロセスが出力をフラッシュする同等のオプションや設定を持っていない場合は、this Unix + Linux questionは擬似を割り当てるいずれかによって、子プロセスが実行される方法を変更することで、バッファリングされた出力を無効にするにはトリックの数を含みターミナルを変更したり、バッファを直接変更することができます。

また、unbufferコマンドが期待するものと同様の擬似端末を持つプロセスを生成するnode-ptynode-pty2もあります。私は以前にどちらのモジュールも使用していませんでしたが、そのために保証することはできません。

+0

こんにちは。この回答と上記のご意見ありがとうございます。私はこれをあまりにも多く探求する時間がなかった。 'expectes' /' unbuffer'に依存することはできませんが、npmパッケージをチェックアウトします。 –

関連する問題