electron-vite/vite-plugin-electron

命令行运行软件后,使用ctrl + c 停止代码,electron后台不关闭

SanGongHappy opened this issue · 27 comments

命令行运行软件后,使用 ctrl + c 停止代码,electron后台不关闭,多次停止代码后,会导致电脑卡顿,甚至崩溃
4f5f464602bfa3e2dc0cfc84b3cdf2b

这与具体业务代码有关,你只是一个截图也没人有本事给你排掉这个 BUG

不好意思,我很少提交issues,我详细描述一下问题
1.正常运行软件
image
2.使用以下操作
image

提供下最小复现 Demo,你现在的代码和样板代码不一样

Siykt commented

+1

windows上遇到这个问题, 不过我是在主线程中调起playwright, playwright崩溃之后, vite server就挂了.

在 windows 上无法退出electron, osx 上也不会退出且重启server必须先强制退出遗留的electron进程.

reproduce: see https://github.com/Siykt/bug-reproduce

video: https://files.catbox.moe/7p8j5m.mp4

+1

也遇到过了,在开发过程中,更新nodejs代码后热重载多次之后发现电脑越来越卡,把当前开发环境停掉之后,一看任务管理器有N个electron.exe进程没有被正常退出,疯狂占用CPU,好像是孤儿进程。

image

有一个复现的办法是,运行一个electron项目,然后在nodejs代码中,疯狂修改代码然后ctrl+s,让项目不断的热重载,就会出现这种情况了。

主进程代码变更会导致 electron重启,但是下面这个代码没有办法完成kill掉所有的子进程:

process.electronApp.kill()

code>>>

我建议合并这个PR #122 @caoxiemeihao

我在本地测试,tree-kill能解决这个问题

现在很苦恼,因为需要开启项目频繁的修改代码调试,修改几次代码之后就得停止项目,然后上任务管理器结束掉electron.exe孤儿进程,然后在开启项目继续调试,如果没有这步操作的话,一直修改不停止项目,CPU马上就会100%。

我建议合并这个PR #122 @caoxiemeihao

我在本地测试,tree-kill能解决这个问题

@shuyuTech 谢谢你的帮助,我已经在 #122 (comment) 留了评论 😄
这个 feature 将会在本周末前发布新版本 🚀

Siykt commented

怎么还没发啊 老哥

@Siykt
马上了,tree-kill 在 Mac 上有点儿问题,不过在 Windows 上应该可以。
你关注下发布

  • 0.15.1 使用 tree-kill 杀死进程
  • 0.15.2 使用 process.electronApp.kill('SIGINT') 杀死进程

有没有人能试试 0.15.2 是否正常,因为在我的电脑上没法复现

image
@caoxiemeihao
win10,0.15.2,还是有问题,疯狂ctrl+s,热重启之后,还是会有进程没有杀掉。

@fanchenio 试试使用 0.15.1 + tree-kill 可不可以

@caoxiemeihao 0.15.1测试可以,一直热重启,也不会有孤儿进程。

@fanchenio vite-plugin-electron@0.15.3 已发,再试试

@fanchenio vite-plugin-electron@0.15.3 已发,再试试

windows测试可行,这个方法比使用treeKill更加优雅

@caoxiemeihao 测试0.15.3还是会有,不过情况有所好转,在我疯狂ctrl+s的情况下,然后最后在控制台ctrl+c退出,目前后台只有一个孤儿进程,可能我测试的情况比较极端,正常应该没问题。

@caoxiemeihao 测试0.15.3还是会有,不过情况有所好转,在我疯狂ctrl+s的情况下,然后最后在控制台ctrl+c退出,目前后台只有一个孤儿进程,可能我测试的情况比较极端,正常应该没问题。

只是触发主进程的热重启吗?还有没有别的操作?

@caoxiemeihao 测试0.15.3还是会有,不过情况有所好转,在我疯狂ctrl+s的情况下,然后最后在控制台ctrl+c退出,目前后台只有一个孤儿进程,可能我测试的情况比较极端,正常应该没问题。

只是触发主进程的热重启吗?还有没有别的操作?

我目前只是在主进程修改代码,然后ctrl+s(操作N遍),最后ctrl+c,退出,没有其他操作了。

Siykt commented

我用 https://github.com/Siykt/bug-reproduce 更新试了一下,目前还是不行

1699322653280-20231107_100154.mp4

v0.15.3 用的 tree-kill

所谓 “还剩一个孤儿进程” 这东西目前没想到好的办法:

  1. 重启 Electron 时候 Vite 进程活着的情况下 tree-kill 逻辑能完全执行完成
  2. Vite 退出时候,进程直接死了 tree-kill 没有执行完成的时间,是导致孤儿进程的原因
image

所以说目前情况得到了”控制“但做的不够”绝对“,我在源码中解释了这个问题,谁有好的思路欢迎 PR。
源码位置 👉 https://github.com/electron-vite/vite-plugin-electron/blob/v0.15.3/src/index.ts#L134-L138


v0.15.2 我看了网上一个说 SIGINT 能讲信号发到 process tree,以为能完美解决杀死所有进程。事实证明不靠谱。
可能重写 ViteDevServer.close() 是个方法,不过我觉的维护成本变高了,不想因为一个孤儿进程改动这么大

v0.15.3 用的 tree-kill

所谓 “还剩一个孤儿进程” 这东西目前没想到好的办法:

  1. 重启 Electron 时候 Vite 进程活着的情况下 tree-kill 逻辑能完全执行完成
  2. Vite 退出时候,进程直接死了 tree-kill 没有执行完成的时间,是导致孤儿进程的原因
image 所以说目前情况得到了”控制“但做的不够”绝对“,我在源码中解释了这个问题,谁有好的思路欢迎 PR。 源码位置 👉 https://github.com/electron-vite/vite-plugin-electron/blob/v0.15.3/src/index.ts#L134-L138

v0.15.2 我看了网上一个说 SIGINT 能讲信号发到 process tree,以为能完美解决杀死所有进程。事实证明不靠谱。 可能重写 ViteDevServer.close() 是个方法,不过我觉的维护成本变高了,不想因为一个孤儿进程改动这么大

我以为是用的SIGINT ,目前看来windows上没什么大问题的。

v0.15.3 用的 tree-kill

所谓 “还剩一个孤儿进程” 这东西目前没想到好的办法:

  1. 重启 Electron 时候 Vite 进程活着的情况下 tree-kill 逻辑能完全执行完成
  2. Vite 退出时候,进程直接死了 tree-kill 没有执行完成的时间,是导致孤儿进程的原因
image 所以说目前情况得到了”控制“但做的不够”绝对“,我在源码中解释了这个问题,谁有好的思路欢迎 PR。 源码位置 👉 https://github.com/electron-vite/vite-plugin-electron/blob/v0.15.3/src/index.ts#L134-L138

v0.15.2 我看了网上一个说 SIGINT 能讲信号发到 process tree,以为能完美解决杀死所有进程。事实证明不靠谱。 可能重写 ViteDevServer.close() 是个方法,不过我觉的维护成本变高了,不想因为一个孤儿进程改动这么大

最后ctrl+c控制台退出没有杀死进程的问题也不是很大,能解决热重载的问题就很好了。

Siykt commented

我在 tree-kill 上传递了 SIGKILL 信号解决了 OSX 上热更新时无法结束子进程的问题. PR #177