Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
SanGongHappy opened this issue Oct 11, 2023 · 27 comments · Fixed by #122
Closed

Comments

@SanGongHappy
Copy link
Contributor

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

@caoxiemeihao
Copy link
Member

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

@SanGongHappy
Copy link
Contributor Author

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

@caoxiemeihao
Copy link
Member

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

@Siykt
Copy link
Contributor

Siykt commented Oct 12, 2023

+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

@kokororin
Copy link

+1

@fanchenio
Copy link

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

@fanchenio
Copy link

image

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

@shuyuTech
Copy link

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

process.electronApp.kill()

code>>>

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

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

@fanchenio
Copy link

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

@caoxiemeihao
Copy link
Member

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

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

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

@caoxiemeihao caoxiemeihao linked a pull request Oct 30, 2023 that will close this issue
caoxiemeihao added a commit that referenced this issue Oct 31, 2023
fix(#168, #162): use `tree-kill` to kill electron App
@Siykt
Copy link
Contributor

Siykt commented Nov 6, 2023

怎么还没发啊 老哥

@caoxiemeihao
Copy link
Member

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

@caoxiemeihao caoxiemeihao mentioned this issue Nov 6, 2023
@caoxiemeihao
Copy link
Member

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

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

@fanchenio
Copy link

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

@caoxiemeihao
Copy link
Member

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

@fanchenio
Copy link

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

@caoxiemeihao
Copy link
Member

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

@shuyuTech
Copy link

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

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

@fanchenio
Copy link

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

@shuyuTech
Copy link

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

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

@fanchenio
Copy link

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

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

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

@Siykt
Copy link
Contributor

Siykt commented Nov 7, 2023

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

1699322653280-20231107_100154.mp4

@caoxiemeihao
Copy link
Member

caoxiemeihao commented Nov 7, 2023

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() 是个方法,不过我觉的维护成本变高了,不想因为一个孤儿进程改动这么大

@shuyuTech
Copy link

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上没什么大问题的。

@fanchenio
Copy link

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
Copy link
Contributor

Siykt commented Nov 7, 2023

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

@SanGongHappy
Copy link
Contributor Author

我在windows上使用bat 关闭时 杀死了electron进程,有大佬有什么改进方案吗? #193

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants