web-dev-qa-db-ja.com

node.js子プロセスモジュールで子から親にメッセージとstdoutを渡す方法は?

子プロセスモジュール、特にchild.spawnとchild.forkに問題があります。私はchild_process.forkのドキュメントに頼っています。

これは、Node.jsプロセスを生成するためのchild_process.spawn()機能の特殊なケースです。通常のChildProcessインスタンスにすべてのメソッドがあることに加えて、返されるオブジェクトには通信チャネルが組み込まれています。詳細については、child.send(message、[sendHandle])を参照してください。

私は以下の問題を単純化しました:

parent.jsは次のとおりです。

var cp = require('child_process');
var n = cp.fork('./child.js');
n.send({a:1});
//n.stdout.on('data',function (data) {console.log(data);});
n.on('message', function(m) {
  console.log("Received object in parent:");
  console.log( m);
});

child.jsは次のとおりです。

process.on('message', function(myObj) {
  console.log('myObj received in child:');
  console.log(myObj);
  myObj.a="Changed value";
  process.send(myObj);
});
process.stdout.write("Msg from child");

予想通り。出力は次のとおりです。

Msg from child
myObj received in child:
{ a: 1 }
Received object in parent:
{ a: 'Changed value' }

コメントなしのparent.jsのコメント行で機能させたい。つまり、親プロセスのn.stdout.on( 'data' ...ステートメントの子プロセスでstdoutをキャッチしたいのですが、コメントを外すと、次のエラーが発生します。

n.stdout.on('data',function (data) {console.log(data);});
    ^
TypeError: Cannot read property 'on' of null

子プロセスの非同期バリエーション、exec、fork、spawnを使用してもかまいません。助言がありますか?

17
Sunny

Stdin、stdout、およびstderrを親プロセスにパイプで戻すには、optionsオブジェクトをfork()に渡すときに、silentプロパティを設定する必要があります。

例えばvar n = cp.fork('./child.js', [], { silent: true });

32
Neil
spawn('stdbuf', ['-i0', '-o0', '-e0', "./test-script" ]);
0