Solución:
Consulte esta discusión
Una vez que comience a escuchar datos en stdin, el nodo esperará la entrada en stdin hasta que se le indique que no lo haga. Cuando el usuario presiona ctrl-d (es decir, el final de la entrada) o el programa llama a stdin.pause (), el nodo deja de esperar a stdin.
Un programa de nodo no se cierra a menos que no tenga nada que hacer o esperar. Lo que está sucediendo es que está esperando en stdin y, por lo tanto, nunca sale.
Intente cambiar su devolución de llamada setTimeout a
console.log('kill');
child.stdin.pause();
child.kill();
Espero que funcione.
Hay un paquete npm realmente genial llamado tree-kill
que hace esto de manera muy fácil y efectiva. Mata el proceso del niño, y todos los procesos secundarios que ese niño puede haber comenzado.
var kill = require('tree-kill');
const spawn = require('child_process').spawn;
var scriptArgs = ['myScript.sh', 'arg1', 'arg2', 'youGetThePoint'];
var child = spawn('sh', scriptArgs);
// some code to identify when you want to kill the process. Could be
// a button on the client-side??
button.on('someEvent', function(){
// where the killing happens
kill(child.pid);
});
Tuve exactamente el mismo problema que tú con omxplayer y la solución en esta publicación de blog funcionó para mí.
var psTree = require('ps-tree');
var kill = function (pid, signal, callback) {
signal = signal || 'SIGKILL';
callback = callback || function () {};
var killTree = true;
if(killTree) {
psTree(pid, function (err, children) {
[pid].concat(
children.map(function (p) {
return p.PID;
})
).forEach(function (tpid) {
try { process.kill(tpid, signal) }
catch (ex) { }
});
callback();
});
} else {
try { process.kill(pid, signal) }
catch (ex) { }
callback();
}
};
// elsewhere in code
kill(child.pid);