Electron js子进程没有被杀死

Posted

技术标签:

【中文标题】Electron js子进程没有被杀死【英文标题】:Electron js child process not getting killed 【发布时间】:2020-05-04 09:14:42 【问题描述】:

我正在编写一个电子 js 脚本来运行一个 .exe 文件。想法是当我单击“开始”按钮时,.exe 应该作为子进程启动,当我单击“停止”时,子进程应该被杀死。

我正在使用 IPC 进行通信。

const getScriptPath = () =>
  if(process.platform==='win32')
    return path.join(__dirname, 'dist_folder','pydoc.exe')

  


const createPyProc =() =>
  let script = getScriptPath()
  pyProc = require('child_process').execFile(script)  
  allProcess.push(pyProc)  

  



const exitPyProc=() => 

    allProcess.forEach(function(proc)
      proc.kill();
    );



ipc.on('start_script',function(event)
  createPyProc()

)

ipc.on('stop_script', function(event)
  exitPyProc()

)

当我单击按钮启动时,我可以在任务管理器中看到子进程在电子主进程下启动,并在按下终止按钮后被终止。

问题: 1. 即使我关闭了电子窗口,其中电子下的子进程已经被杀死,pydoc.exe 的任务管理器中仍然会留下一个剩余的独立进程。

我的子进程命令是否正确?

 pyProc = require('child_process').execFile(script)  

【问题讨论】:

【参考方案1】:
  const subprocess = spawn(getScriptPath(), args);

  subprocess.stdout.on('data', data => 
    console.log(`Daemon stdout: $data`);
    resolve(data.toString());
    // Here is where the output goes
  );
  subprocess.stderr.on('data', data => 
    console.log(`Daemon stderr: $data`);
    resolve(data.toString());
    // Here is where the error output goes
  );
  subprocess.on('close', code => 
    console.log(`Successfully closed. $code`);
    // Here you can get the exit code of the script
  );

  ipc.on('stop_script', function(event)
    subprocess.kill(); 
  )

【讨论】:

以上是关于Electron js子进程没有被杀死的主要内容,如果未能解决你的问题,请参考以下文章

systemd `systemctl stop` 主动杀死子进程

Python:当父进程死亡时如何杀死子进程?

主进程被杀死时,如何保证子进程同时退出,而不变为孤儿进程

匿名管道:当子进程被杀死时,父进程中的 ReadFile 继续等待

如何在父进程被杀死/完成时保持子进程处于活动状态(在 Windows 中)

如何使用子进程模块杀死(或避免)僵尸进程