Reputation: 507
For example sake, I'm running the most basic webServer in node (I'm using windows) with the following code (named 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/');
I would like to run this as a child process, and am successfully doing so with the following:
var exec = require('child_process').exec;
var serv = exec('node server.js', function(error, stdout, stderr){
console.log('outputs & errors:' + error, stdout, stderr);
});
However, I receive nothing once I run the second file. No "outputs & errors", no "Server running at...". If I type localhost:1337 in a browser, I get "hello world" though, so I know it's running. Is there a way to pipe that "server running..." so I can be "sure" it's listening?
Upvotes: 20
Views: 18787
Reputation: 21380
Just specify that you want the child process to inherit stdio of parent one:
require('child_process').exec('node server.js', { stdio: 'inherit' });
Upvotes: 1
Reputation: 1301
var child_process = nw.require('child_process');
var spawn = child_process
//The following is on windows and I record stdout and stderr to my logger
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);
});
Upvotes: 2
Reputation: 18979
Exec will return STDOUT
and STDERR
when the child finishes, see exec
. That's why you do not see any output, when the server starts.
What you want is fork
, which automatically connects the child process STDOUT
and STDERR
to your parent's. This is the preferred way if your child process is a node process.
If you want to use exec you can use the child processe's streams to get your data, e.g.:
child.stdout.pipe(process.stdout);
child.stderr.pipe(process.stderr);
Upvotes: 29