Подтвердить что ты не робот

Детский процесс не убит с помощью 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();
}
4b9b3361

Ответ 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, лучше запустить двоичный файл прямо из папки установки