我正在从电子主管开始一个后台程序(在Windows上),如下所示:
app_exe = require("child_process").spawn(
"app.exe" ,
[ "--params", ... ],
{ stdio: "ignore" }
);
但是当电子关闭时我无法杀死这个过程(.on("closed")
或on("window-all-closed")
)
我尝试child.kill([signal])
,但tree-kill或taskkill没有结果:只有第一个进程(示例中的6036)被杀死,第二个进程(5760)仍然过时。< / p>
exec taskkill /F /T /PID
也没有杀死它。
杀死的唯一方法是exec taskkill /F /IM app.exe /T
,但这样我就无法运行电子应用的两个实例。
我在Windows上的流程管理中遗漏了一些明显的东西?
答案 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()
删除以前关闭的窗口。