Детский процесс не убит с помощью Node.JS
Я использовал child_process.exec
/child_process.spawn
, чтобы разблокировать новый процесс, а затем убить его с помощью child.kill
/process.kill
. Он отлично работает с простыми бинарными исполняемыми файлами, такими как cat
/ls
, и дочерний процесс просто убивается.
Однако, когда вы получаете сценарии (скажем, P1), что выдает еще один дочерний процесс (скажем, P2), только интерпретатор script P1 убивается, а не дочерний процесс P2.
ВОПРОС: существует ли какой-либо способ получения такого дочернего процесса P2, убитого с помощью Node.JS?
Код работает нормально с run_and_kill('ls -Al /usr/lib')
, но не ОК с run_and_kill('firefox')
:
function run_and_kill(cmd) {
var exec = require('child_process').exec,
ls = exec(cmd);
console.log('Child process started: %d', ls.pid);
ls.on('exit', function(code, signal) {
console.log('exit with code %s and signal %s', code, signal);
});
ls.kill();
}
Ответы
Ответ 1
Самый безопасный способ, который я нашел для этого, - создать процесс появления спава, чтобы убить сигнал, используя параметр child.pid в качестве аргумента. Пример с fork:
var process;
process = require('child_process');
var fork, child;
fork = process.fork;
child = fork('./index');
var spawn;
spawn = process.spawn;
spawn('kill', [child.pid]);
console.log('sending SIGTERM to child process (socket server)');
Обычно я использую это в спецификациях, в основном в блоках beforeAll/afterAll для запуска/уничтожения серверов (в примере "./index.js" ).
Ответ 2
Я думаю, что ваш P2 не является ни вилкой, ни дочерним элементом P1, а скорее параллельным процессом, порожденным им. В случае Firefox (по крайней мере, в Linux) приложение firefox запускается оболочкой оболочки script. Если это всегда будет firefox, лучше запустить двоичный файл прямо из папки установки