例如,我正在运行节点中最基本的webServer(我使用的是Windows),其中包含以下代码(名为server.js):
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);
});
然而,一旦我运行第二个文件,我什么也得不到。没有“输出和错误”,没有“服务器运行在......”。如果我在浏览器中键入localhost:1337,我会得到“hello world”,所以我知道它正在运行。有没有办法管道“服务器正在运行......”所以我可以“肯定”它在听?
答案 0 :(得分:24)
当孩子完成后,Exec将返回STDOUT
和STDERR
,请参阅 exec
。这就是为什么在服务器启动时看不到任何输出的原因。
您想要的是 fork
,它会自动将子流程STDOUT
和STDERR
与您的父流程相关联。如果您的子进程是节点进程,这是首选方法。
如果你想使用exec,你可以使用子进程的流来获取你的数据,例如:
child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
答案 1 :(得分:0)
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);
});
答案 2 :(得分:0)
只需指定您希望子进程继承父进程的stdio:
require('child_process').exec('node server.js', { stdio: 'inherit' });