Создать и убить процесс в node.js
Возможно, за это проголосовали бы, но я не понимаю, где я иду не так.
Я пытаюсь создать процесс в javascript и через некоторое время убить его (для тестирования).
В конце процесс будет бесконечным циклом, который мне нужно будет перезапустить с разными аргументами в указанное время, поэтому я подумал, что порождение процесса и его уничтожение - лучший способ сделать это.
Мой тестовый код:
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);
});
Результат:
#~$ node test.js
Timeout
kill
Но мне все еще нужно отправить Ctrl + C, чтобы завершить программу
Что мне не хватает?
РЕДАКТИРОВАТЬ: На Raspbian, узел 0.10.17, omxplayer является двоичным (видеоплеер).
Попробовал: добавил chmod + x в приложение. Запущен как root. Приостановлена работа над дочерним процессом. Использование всех связанных с завершением сигналов в команде kill.
EDIT2:
Запустил команду ps во время работы приложения:
2145 bash
2174 node
2175 omxplayer
2176 omxplayer.bin
2177 ps
Так что omxplayer do - это обертка, которая не завершает процесс, когда он завершается, есть ли способ получить pid обернутого процесса?
EDIT3:
Все еще кусая пыль, попробовал это:
spawn('kill', ['-QUIT', '-$(ps opgid= '+child.pid+')']);
То, что я думал, убило бы всех детей из omxplayer, я не знаю, если использование spawn, как это неправильно, или это код, который не работает.
ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ:
Последнее редактирование, которое я сделал, было хорошим ответом, но его пришлось немного обмануть.
Я создал файл sh (с правом выполнения) следующим образом:
PID=$1
PGID=$(ps opgid= "$PID")
kill -QUIT -"$PGID"
Который я начинаю так:
execF('kill.sh', [child.pid], function(){
console.log('killed');
});
Вместо child.kill.
Я не уверен, что это лучший способ, ни код чистый, но он работает.
Я приму любой ответ, который сделает его более понятным или, что лучше, без необходимости выполнять файл.