【问题标题】:electron and node on windows, kill a spawned processwindows上的电子和节点,杀死一个产生的进程
【发布时间】:2017-06-27 17:28:02
【问题描述】:

我正在从电子主程序启动一个后台进程(在 Windows 上),如下所示:

app_exe = require("child_process").spawn(
  "app.exe" ,
  [ "--params", ... ],
  { stdio: "ignore" }
);

这很好用,我可以从进程资源管理器中看到:

但是当电子关闭时我无法终止进程(.on("closed")on("window-all-closed")

我尝试了child.kill([signal]),但也尝试了tree-killtaskkill,但没有结果:只有第一个进程(示例中的6036)被杀死,第二个进程(5760)仍然过时。

也 exec taskkill /F /T /PID 不会杀死它。

杀死的唯一方法是 exec taskkill /F /IM app.exe /T,但这样我无法运行电子应用程序的两个实例。

我在 Windows 上的进程管理中遗漏了一些明显的东西?

【问题讨论】:

  • 你能以某种方式获得子进程的 PID 吗?如果你能做到,你只需要打电话给process.kill(PID)
  • 而不是 on('close') 你试过 on('will-quit') 吗?

标签: node.js windows electron


【解决方案1】:

我在 Windows 7 机器上看到了类似的问题。我相信较新的操作系统会自动杀死子进程。

我要做的就是保存生成进程的 PID,并在所有窗口关闭时向其发送 SIGTERM 消息以将其杀死。现在,如果在 Electron 应用程序关闭之前进程有可能以其他方式死亡,则操作系统可能已经回收了子进程的 PID,因此为了更加稳健,我使用了find-process npm 模块来确保 PID我坚持的与正确的流程相关联。

const proc = cp.spawn("app.exe");

app.on("window-all-closed", async () => {
    const list = await require("find-process")("pid", proc.pid);
    app.quit();
    if (list[0] && list[0].name.toLowerCase() === "app.exe")
        process.kill(proc.pid);
});

现在,如果您的 Electron 应用程序没有正常退出(并且上面的代码没有运行),您将不得不依赖另一种技术。

如果您控制正在生成的子进程,则可以尝试启动一个线程来侦听或 ping 主进程。如果它没有看到主进程,它可以杀死自己。

如果您不控制生成的应用程序,那么我没有想法,但上面的代码将处理大多数情况。

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题,论坛上的任何问题/答案都无法解决该问题。所以经过一些研究,我找到了一个简单的解决方法并分享它:

    // Workaround to close all processes / sub-processes after closing the app
    electron.app.once('window-all-closed', electron.app.quit);
    electron.app.once('before-quit', () => {
        window.removeAllListeners('close');
    });
    

    它对我来说非常有用,希望它对你有用。

    【讨论】:

      【解决方案3】:

      你可以用这段代码试试:

      ipcMain.on('exampletab:close', () => {
          ipcMain.removeAllListeners();
          exampleWindow.close();
      });
      

      这段代码节省了我很多时间。当您关闭子窗口时,使用removeAllListeners() 删除以前关闭的窗口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多