macOS Big Sur关闭终端窗口时Nodemon无法终止Node.js进程
解决macOS Big Sur下nodemon启动的Node进程关闭终端后残留的问题
我之前在macOS Big Sur 11.0.1上也碰到过一模一样的问题!折腾了好一阵才找到几个可行的解决办法,分享给你:
方案1:给nodemon添加--exitcrash参数(最推荐)
这个参数是nodemon官方后来针对这类孤儿进程问题推出的,它会强制nodemon在父进程终止时跟着退出子进程。你有两种设置方式:
- 直接修改项目的
package.json里的npm脚本:"scripts": { "dev": "nodemon --exitcrash dist/index.js" } - 或者在项目根目录创建
nodemon.json配置文件,统一配置:{ "exitcrash": true }
设置完之后,再关闭终端窗口选择“Terminate”,node进程就会被彻底杀掉了。
方案2:给ZSH添加终端关闭钩子
如果你不想改动nodemon的配置,可以给ZSH加一个退出钩子,让终端关闭时自动清理所有子进程。打开你的~/.zshrc文件,添加下面这行代码:
trap 'pkill -TERM -P $$' EXIT
保存后执行source ~/.zshrc让配置生效。这样每次关闭终端窗口时,系统会自动杀掉所有该终端启动的子进程,包括nodemon和它拉起的node服务。
方案3:降级nodemon版本(临时应急)
这个问题其实是特定版本的nodemon和Big Sur的进程管理机制不兼容导致的,我当时临时降级到nodemon@2.0.7就解决了问题,你可以试试:
npm uninstall nodemon npm install nodemon@2.0.7 --save-dev
另外补充一点:你提到的Ctrl+C能正常终止、文件更新会自动终止进程,是因为这两种场景下nodemon能正常捕获到终止信号,但终端窗口关闭时的信号传递在Big Sur下有了变化,nodemon默认的处理逻辑没跟上,上面的方案1就是官方针对这个问题给出的修复方案,优先推荐使用。
内容的提问来源于stack exchange,提问作者wmcb91




