web-dev-qa-db-ja.com

実行中の子プロセスの出力をnodejs(windows)に表示する

たとえば、次のコード(server.jsという名前)を使用して、ノード(Windowsを使用)で最も基本的なwebServerを実行しています。

    var http = require('http');
       http.createServer(function (req, res) {
         res.writeHead(200, {'Content-Type': 'text/plain'});
         res.end('Hello World\n');
       }).listen(1337, '127.0.0.1');
    console.log('Server running at http://127.0.0.1:1337/');

これを子プロセスとして実行したいと思いますが、次のようにして正常に実行しています。

var exec = require('child_process').exec;
var serv = exec('node server.js', function(error, stdout, stderr){
    console.log('outputs & errors:' + error, stdout, stderr);
});

ただし、2番目のファイルを実行すると何も受信しません。 「出力とエラー」、「サーバーの実行中...」はありません。ブラウザでlocalhost:1337と入力すると、「hello world」が表示されるので、実行されていることがわかります。その「サーバーが実行中...」をパイプして、それがリッスンしていることを「確認」できるようにする方法はありますか?

16
AberZombie

Execは、子が終了するとSTDOUTSTDERRを返します。execを参照してください。そのため、サーバーの起動時に出力が表示されません。

必要なのはforkで、これは子プロセスSTDOUTSTDERRを親のプロセスに自動的に接続します。これは、子プロセスがノードプロセスである場合に推奨される方法です。

Execを使用する場合は、子プロセスのストリームを使用してデータを取得できます。例:

child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
25
topek
var child_process = nw.require('child_process');
var spawn = child_process

//以下はWindowsで、stdoutとstderrをロガーに記録します

var proc = spawn('cmd.exe', ['/S', '/C', script_path]);
proc.stdout.on('data', function(data) {
       logger(logtag, 'proc_stdout: ' + data);
});

proc.stderr.on('data', function(data) {
    logger(logtag, 'proc_stderr: ' + data);
});
1
Verdigrass

子プロセスが親プロセスのstdioを継承するように指定するだけです。

require('child_process').exec('node server.js', { stdio: 'inherit' });
0
Qwertiy