命令行运行软件后,使用ctrl + c 停止代码,electron后台不关闭
SanGongHappy opened this issue · 27 comments
这与具体业务代码有关,你只是一个截图也没人有本事给你排掉这个 BUG
提供下最小复现 Demo,你现在的代码和样板代码不一样
+1
windows上遇到这个问题, 不过我是在主线程中调起playwright, playwright崩溃之后, vite server就挂了.
在 windows 上无法退出electron, osx 上也不会退出且重启server必须先强制退出遗留的electron进程.
reproduce: see https://github.com/Siykt/bug-reproduce
+1
也遇到过了,在开发过程中,更新nodejs代码后热重载多次之后发现电脑越来越卡,把当前开发环境停掉之后,一看任务管理器有N个electron.exe进程没有被正常退出,疯狂占用CPU,好像是孤儿进程。
主进程代码变更会导致 electron重启,但是下面这个代码没有办法完成kill掉所有的子进程:
process.electronApp.kill()
我建议合并这个PR #122 @caoxiemeihao
我在本地测试,tree-kill能解决这个问题
现在很苦恼,因为需要开启项目频繁的修改代码调试,修改几次代码之后就得停止项目,然后上任务管理器结束掉electron.exe孤儿进程,然后在开启项目继续调试,如果没有这步操作的话,一直修改不停止项目,CPU马上就会100%。
我建议合并这个PR #122 @caoxiemeihao
我在本地测试,tree-kill能解决这个问题
@shuyuTech 谢谢你的帮助,我已经在 #122 (comment) 留了评论 😄
这个 feature 将会在本周末前发布新版本 🚀
怎么还没发啊 老哥
@Siykt
马上了,tree-kill 在 Mac 上有点儿问题,不过在 Windows 上应该可以。
你关注下发布
0.15.1
使用tree-kill
杀死进程0.15.2
使用process.electronApp.kill('SIGINT')
杀死进程
有没有人能试试 0.15.2
是否正常,因为在我的电脑上没法复现
@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,退出,没有其他操作了。
我用 https://github.com/Siykt/bug-reproduce 更新试了一下,目前还是不行
1699322653280-20231107_100154.mp4
v0.15.3
用的tree-kill
所谓 “还剩一个孤儿进程” 这东西目前没想到好的办法:
- 重启 Electron 时候 Vite 进程活着的情况下
tree-kill
逻辑能完全执行完成 - Vite 退出时候,进程直接死了
tree-kill
没有执行完成的时间,是导致孤儿进程的原因
所以说目前情况得到了”控制“但做的不够”绝对“,我在源码中解释了这个问题,谁有好的思路欢迎 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
所谓 “还剩一个孤儿进程” 这东西目前没想到好的办法:
所以说目前情况得到了”控制“但做的不够”绝对“,我在源码中解释了这个问题,谁有好的思路欢迎 PR。 源码位置 👉 https://github.com/electron-vite/vite-plugin-electron/blob/v0.15.3/src/index.ts#L134-L138
- 重启 Electron 时候 Vite 进程活着的情况下
tree-kill
逻辑能完全执行完成- Vite 退出时候,进程直接死了
tree-kill
没有执行完成的时间,是导致孤儿进程的原因
v0.15.2
我看了网上一个说SIGINT
能讲信号发到process tree
,以为能完美解决杀死所有进程。事实证明不靠谱。 可能重写ViteDevServer.close()
是个方法,不过我觉的维护成本变高了,不想因为一个孤儿进程改动这么大
我以为是用的SIGINT ,目前看来windows上没什么大问题的。
v0.15.3
用的tree-kill
所谓 “还剩一个孤儿进程” 这东西目前没想到好的办法:
所以说目前情况得到了”控制“但做的不够”绝对“,我在源码中解释了这个问题,谁有好的思路欢迎 PR。 源码位置 👉 https://github.com/electron-vite/vite-plugin-electron/blob/v0.15.3/src/index.ts#L134-L138
- 重启 Electron 时候 Vite 进程活着的情况下
tree-kill
逻辑能完全执行完成- Vite 退出时候,进程直接死了
tree-kill
没有执行完成的时间,是导致孤儿进程的原因
v0.15.2
我看了网上一个说SIGINT
能讲信号发到process tree
,以为能完美解决杀死所有进程。事实证明不靠谱。 可能重写ViteDevServer.close()
是个方法,不过我觉的维护成本变高了,不想因为一个孤儿进程改动这么大
最后ctrl+c控制台退出没有杀死进程的问题也不是很大,能解决热重载的问题就很好了。