You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何一次性终止通过npm start并行启动的多个npm子任务?

解决方案

这个问题我之前也碰到过,用&并行启动确实会有进程组管理的坑,给你几个靠谱的解决办法:

1. 使用专门的npm脚本并行工具(推荐)

最省心的方式是用npm-run-all,它专门处理npm脚本的并行/串行执行,并且会自动管理进程组,确保Ctrl+C能终止所有子进程:

  • 首先安装依赖:
    npm install npm-run-all --save-dev
    
  • 修改package.json里的start脚本:
    "start": "npm-run-all -p watch-blog watch-data server"
    

这里的-p参数表示并行执行所有后续的脚本命令,当你按下Ctrl+C时,npm-run-all会向所有子进程发送终止信号,一次性搞定所有任务。

2. 用Shell进程组统一管理(无需额外依赖)

如果不想装新工具,可以把所有并行命令放到括号里,让它们属于同一个进程组:
修改start脚本为:

"start": "(npm run watch-blog & npm run watch-data & npm run server)"

这样所有后台进程会和前台进程同属一个进程组,当你按下Ctrl+C时,SIGINT信号会发送给整个进程组,所有任务都会被终止。

注意:如果你的默认Shell是zsh,可能需要调整一下交互设置,不过bash下这个方法是直接生效的。

3. 手动清理残留进程(临时应急)

如果上面的方法都没来得及用,需要手动杀死残留的watchytouch进程:

  • 查找相关进程:
    ps aux | grep watchy
    
  • 杀死单个进程:
    kill -9 <进程ID>
    
  • 或者一次性杀死所有watchy进程:
    pkill watchy
    
为什么原来的方式会失效?

当你用&把命令放到后台时,每个后台进程会属于独立的进程组,而Ctrl+C只会向前台进程(最后一个server)发送SIGINT信号,后台的watch-blogwatch-data不会收到这个信号;甚至关闭终端时,有些进程可能忽略了SIGHUP信号(比如watchy这类工具),导致它们继续在后台运行。

内容的提问来源于stack exchange,提问作者Frank N

火山引擎 最新活动