I'm trying to spawn a process in javascript, and kill it after some time (for testing purposes).
In the end, the process will be a infinite loop that I need to restart with different arguments at specified time, so I thought that spawning the process and killing it was the best way to do this.
My test code is:
var spawn=require('child_process').spawn
, child=null;
child=spawn('omxplayer', ['test.mp4'], function(){console.log('end');}, {timeout:6000});
console.log('Timeout');
setTimeout(function(){
console.log('kill');
child.kill();
}, 1200);
child.stdout.on('data', function(data){
console.log('stdout:'+data);
});
child.stderr.on('data', function(data){
console.log('stderr:'+data);
});
child.stdin.on('data', function(data){
console.log('stdin:'+data);
});
The result is:
#~$ node test.js
Timeout
kill
But I still need to send ctrl+C to end the program. What am I missing?
On Raspbian, node 0.10.17, omxplayer is a binary (video player).
I tried:
- Added
chmod +x
to the app.
- Launched as root.
- Paused stdin of the child process. Using all terminate-related signal in the kill command.
I also launched a ps
command while the app was running:
2145 bash
2174 node
2175 omxplayer
2176 omxplayer.bin
2177 ps
So omxplayer is a wrapper, who don t kill it's child process when it end, is there any way to get the pid of the wrapped process?
Still biting dust, tried this:
spawn('kill', ['-QUIT', '-$(ps opgid= '+child.pid+')']);
Which I thought would kill all children of omxplayer, I don t know if using spawn like that is wrong or if it's the code that doesn't work.
The last edit I made was the good answer, but had to be edited a bit.
I created a sh file (with execute right) like this:
PID=$1
PGID=$(ps opgid= "$PID")
kill -QUIT -"$PGID"
Which I start like this:
execF('kill.sh', [child.pid], function(){
console.log('killed');
});
Instead of child.kill
.
I'm not sure if it s the best way to do, nor if the code is clean, but it does work.
I'll accept any answer which make it in a cleaner way or, even better, without having to execute a file.
See Question&Answers more detail:
os