我正在从 Electron main 启动一个后台进程(在 Windows 上),如下所示:
app_exe = require("child_process").spawn(
"app.exe" ,
[ "--params", ... ],
{ stdio: "ignore" }
);
this works fine, i can see this from process explorer:
![enter image description here](https://i.stack.imgur.com/HTEU7.png)
但当电子关闭时我无法终止该过程(.on("closed")
or on("window-all-closed")
)
i tried child.kill([signal])
, 但是也树木毁坏 https://www.npmjs.com/package/tree-kill or taskkill https://www.npmjs.com/package/taskkill没有结果:只有第一个进程(示例中的 6036)被终止,第二个进程(5760)仍然过时。
还执行taskkill /F /T /PID
不会杀死它。
杀死的唯一方法是 exectaskkill /F /IM app.exe /T
,但这样我就无法运行电子应用程序的两个实例。
我遗漏了 Windows 上进程管理的一些明显内容?
我在 Windows 7 机器上看到了类似的问题。我相信较新的操作系统会自动终止子进程。
我所要做的就是保存生成进程的 PID 并将其发送给SIGTERM
当所有窗口关闭时杀死它的消息。现在,如果在 Electron 应用程序关闭之前该进程有可能通过其他方式终止,则操作系统可能已经回收了子进程的 PID,因此为了额外的稳健性,我使用了find-process https://www.npmjs.com/package/find-processnpm 模块,以确保我保留的 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 主进程的线程。如果它看不到主进程,它可能会自杀。
如果您不控制生成的应用程序,那么我就没有主意了,但是上面的代码可以处理大多数情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)