how-to-send-control-c-to-child-process

2,984 views
Skip to first unread message

Herry Wang

unread,
Jul 27, 2012, 7:47:15 PM7/27/12
to nod...@googlegroups.com

I am writing one web-like linux shell using node.js + socket.io. Simple command like, ls, cd are working well. But when issue command like ping google.com, the stdout is printing endlessly. I tried to send Ctrl +C to stdin, but no luck.

1) spawn 'bash' process

spawn = require('child_process').spawn;
var sh = spawn('bash');

2) send bash stdout to socket.io

sh.stdout.on('data', function(data) {
   console
.log('stdout' + data);
   listener
.sockets.emit("stdout",new Buffer(data));
});

3) Sending Ctl C (\x03) to bash's stdin. var listener = io.listen(server);

listener.set('log level',1);
listener
.sockets.on('connection', function(client){
   client
.on('message', function(data){
     
if(data === "KILL") {
         console
.log('!!!!' + data);
         sh
.stdin.write('\x03');
         client
.broadcast.send(new Buffer("KILLING "));
         
//return;
     
};
      console
.log(data);
      sh
.stdin.write(data+"\n");
      client
.broadcast.send(new Buffer("> "+data));
   
});
});

I am stuck at this point. Seems like

Marak Squires

unread,
Jul 27, 2012, 7:49:05 PM7/27/12
to nod...@googlegroups.com
I would say try: https://github.com/chjj/tty.js

--
Job Board: http://jobs.nodejs.org/
Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nod...@googlegroups.com
To unsubscribe from this group, send email to
nodejs+un...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Herry Wang

unread,
Jul 27, 2012, 7:57:51 PM7/27/12
to nod...@googlegroups.com
yeah, actually i am looking into tty.js.  But i wanna use it in my own project with 'light' version.
Just wandering why \x03 is not working.

Thanks
Herry

Nathan Rajlich

unread,
Jul 27, 2012, 8:42:04 PM7/27/12
to nod...@googlegroups.com
You need to do something like:

  process.kill(child.pid, 'SIGINT');

Herry Wang

unread,
Jul 29, 2012, 2:54:07 PM7/29/12
to nod...@googlegroups.com
yup, spawn a 'bash' child process may be not a good idea. 
spawn a process according to input command string is more easier.

Thanks
Herry

Daniel Pruessner

unread,
Oct 9, 2018, 3:58:15 PM10/9/18
to nodejs
@Henry, Did you ever find why this is not working?

I found this thread searching for the exact thing.  We need a connection to a shell across an encrypted connection.  I found that when I run the tunnel program from the commandline, I can use "^C" to kill processes like `watch`.  However, when I create the tunnel from a daemon (as will happen in our application), ^C fails to kill the process.  I just see a "^C" on the screen.  Since most commands can be killed in BASH with "^Z kill %", we can probably move forward -- the tunnel is a fail-safe-- but I'd like to understand the mechanism why sending "\x03" to the spawn'd `stdin` fails to create a SIGINT.

Thanks!
Reply all
Reply to author
Forward
0 new messages