电子和窗口上的节点,杀死一个衍生过程

时间:2017-02-09 15:54:12

标签: node.js windows electron

我正在从电子主管开始一个后台程序(在Windows上),如下所示:

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

这工作正常,我可以从流程资源管理器中看到: enter image description here

但是当电子关闭时我无法杀死这个过程(.on("closed")on("window-all-closed")

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

exec taskkill /F /T /PID也没有杀死它。

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

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

3 个答案:

答案 0 :(得分:0)

我有完全相同的问题,论坛上没有问题/答案可以解决这个问题。因此,经过一些研究,我发现了一个简单的解决方法,我即可分享它:

// 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');
});

它非常适合我,希望它适合你。

答案 1 :(得分:0)

我在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主进程的线程。如果看不到主要进程,它可能会杀死自己。

如果您不控制spawned-app,那么我就没主意了,但是上面的代码可以处理大多数情况。

答案 2 :(得分:0)

您可以使用以下代码进行尝试:

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

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