Я пытаюсь создать процесс в 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.
- Приостановлено stdin дочернего процесса. Использование всех связанных с завершением сигналов в команде kill.
Я также запустил команду ps
во время работы приложения:
2145 bash
2174 node
2175 omxplayer
2176 omxplayer.bin
2177 ps
Итак, omxplayer - это оболочка, которая не завершает дочерний процесс, когда он завершается, есть ли способ получить pid упакованного процесса?
Все еще кусая пыль, попробовал это:
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
.
Я не уверен, является ли это лучшим способом, или если код чист, но он работает.
Я приму любой ответ, который сделает его более понятным или, что еще лучше, без необходимости выполнения файла.