Как я могу создать дочерний процесс, который запускает электронное приложение, а затем убивает его, сохраняя при этом родительский процесс живым? - PullRequest
0 голосов
/ 09 мая 2019

У меня есть основной процесс, который запускает (порождает) электронное приложение (дочерний процесс), и я пытаюсь убить его, сохраняя родительский ресурс через некоторое время.Я всегда убиваю только родителя, и единственное, чего я достиг после прочтения большого количества статей (в том числе и о stackoverflow), - это то, что я убил их обе.Но мне нужно, чтобы родитель остался в живых.Я хочу иметь возможность убить дочерний процесс, который больше не отвечает или дает сбой.

Я пытался форкать, но и порождать.Я попробовал все это в parent.js (код ниже):

Убивает обоих:

process.kill(-script.pid);

убивает только родителей:

kill(-script.pid, SIGKILL);

убивает только родителей (скрипт является дочерним по отношению к script = spawn (...)):

script.stdin.pause();
script.kill();

parent.js:

let spawn = require('child_process').spawn;

console.log('main process started.');

let script = spawn('npm', ["start"], {detached: true});

setTimeout(function(){

  //This one kills both
  process.kill(-script.pid);

  }, 3000);

child.js:

const exec = require('child_process').exec;

exec('cd $HOME/Desktop/Myapp && npm start');

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

Возможно, это связано с Электроном?

1 Ответ

0 голосов
/ 09 мая 2019

Я нашел одно возможное решение сам.Для тех, кто заинтересован.

Я использую эти два модуля:

const findProcess = require('find-process');
const ps = require('ps-node');

Я в основном использую findProcess, чтобы найти PID по имени, а затем я использую ps, чтобы убить все процессы, связанные с этим.

findProcess('name', "Electron")
    .then(function (list) {

      for(var i=0; i<list.length; i++){

        console.log(list[i].pid);
        pidToKill = list[i].pid;
        pidToKill = pidToKill.toString();

        ps.kill( pidToKill, {
          signal: 'SIGKILL',
          timeout: 10,  // will set up a ten seconds timeout if the killing is not successful
        }, function(){});

      }
    }, function (err) {
      console.log(err.stack || err);
    });

Либо это поможет вам, либо у вас есть лучшее решение.Если есть лучшие решения, то я рад услышать о них.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...