Создать и убить процесс в 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.

Я не уверен, что это лучший способ, ни код чистый, но он работает.

Я приму любой ответ, который сделает его более понятным или, что лучше, без необходимости выполнять файл.

Ответы на вопрос(7)

Ваш ответ на вопрос