1. ホーム
  2. node.js

[解決済み] Node.jsで子プロセスを生成し、端末の出力をライブで取得する。

2022-05-13 16:42:06

質問

hi'を出力し、1秒スリープし、'hi'を出力し、1秒スリープする、というようなスクリプトがあります。さて、このモデルでこの問題に取り組もうと思いました。

var spawn = require('child_process').spawn,
temp    = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR');

temp.stdout.pipe(process.stdout);

さて、問題は出力を表示するためにタスクが終了している必要があることです。私が理解しているように、これは新しく生成されたプロセスが実行制御を取るという事実によるものです。明らかに、node.jsはスレッドをサポートしていないので、何か解決策がありますか?私のアイデアは、おそらく2つのインスタンスを実行し、最初のインスタンスはタスクを作成する特定の目的のために、それは2番目のインスタンスのプロセスに出力をパイプすることでした、これが達成されることを考慮します。

どのように解決するのですか?

私はまだNode.jsに足を踏み入れていませんが、いくつかのアイディアを持っています。 execFile の代わりに spawn ; execFile はスクリプトのパスがある場合に使用します。 spawn は、Node.jsがシステムパスに対して解決できる、よく知られたコマンドを実行するためのものです。

1. コールバックを提供する を用意して、バッファリングされた出力を処理します。

var child = require('child_process').execFile('path/to/script', [ 
    'arg1', 'arg2', 'arg3', 
], function(err, stdout, stderr) { 
    // Node.js will invoke this callback when process terminates.
    console.log(stdout); 
});  

2. 子プロセスの標準出力にリスナーを追加する ストリーム ( 9thポート・ネット )

var child = require('child_process').execFile('path/to/script', [ 
    'arg1', 'arg2', 'arg3' ]); 
// use event hooks to provide a callback to execute when data are available: 
child.stdout.on('data', function(data) {
    console.log(data.toString()); 
});

さらに、生成されたプロセスをNodeのコントロールターミナルから切り離し、非同期で実行できるようにするオプションもあるようです。私はまだこれをテストしていません。 API ドキュメント には、このような例があります。

child = require('child_process').execFile('path/to/script', [ 
    'arg1', 'arg2', 'arg3', 
], { 
    // detachment and ignored stdin are the key here: 
    detached: true, 
    stdio: [ 'ignore', 1, 2 ]
}); 
// and unref() somehow disentangles the child's event loop from the parent's: 
child.unref(); 
child.stdout.on('data', function(data) {
    console.log(data.toString()); 
});