Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nodejs Child Process: write to stdin from an already initialised process

I am trying to spawn an external process phantomjs using node's child_process and then send information to that process after it was initialized, is that possible?

I have the following code:

var spawn = require('child_process').spawn,
    child = spawn('phantomjs');

child.stdin.setEncoding = 'utf-8';
child.stdout.pipe(process.stdout);

child.stdin.write("console.log('Hello from PhantomJS')");

But the only thing I got on the stdout is the initial prompt for phantomjs console.

phantomjs> 

So it seems the child.stdin.write is not making any effect.

I am not sure I can send additional information to phantomjs ater the initial spawn.

thanks in advance.

like image 936
zanona Avatar asked Nov 05 '12 10:11

zanona


2 Answers

You need to pass also \n symbol to get your command work:

var spawn = require('child_process').spawn,
    child = spawn('phantomjs');

child.stdin.setEncoding('utf-8');
child.stdout.pipe(process.stdout);

child.stdin.write("console.log('Hello from PhantomJS')\n");

child.stdin.end(); /// this call seems necessary, at least with plain node.js executable
like image 134
Vadim Baryshev Avatar answered Oct 16 '22 03:10

Vadim Baryshev


You need to surround your write by cork and uncork, the uncork method flushes all data buffered since cork was called. child.stdin.end() will flush data too, but no more data accepted.

var spawn = require('child_process').spawn,
    child = spawn('phantomjs');

child.stdin.setEncoding('utf-8');
child.stdout.pipe(process.stdout);

child.stdin.cork();
child.stdin.write("console.log('Hello from PhantomJS')\n");
child.stdin.uncork();
like image 45
Jennal Avatar answered Oct 16 '22 03:10

Jennal