如何并行启动Rails服务器与Webpack服务器并同时终止二者?
解决Rails开发服务器与Webpack服务器并行启动且可统一终止的问题
我完全懂你的痛点——直接用rails s & bin/webpack-dev-server这种方式后台运行进程,按下Ctrl+C时只有前台进程会终止,后台的进程还会留在系统里占着端口,每次都得手动查PID杀进程,实在麻烦。下面给你几个靠谱的解决方案,尤其是适合用Yarn脚本统一管理的方法:
推荐方案:使用concurrently工具
concurrently是专门用来并行运行多个命令的工具,它能统一处理进程信号,当你按下Ctrl+C时,会自动终止所有启动的子进程,完美解决残留问题。
步骤1:安装依赖
在项目根目录下执行命令,把concurrently添加为开发依赖:
yarn add concurrently --dev
步骤2:配置Yarn脚本
打开项目根目录的package.json,在scripts字段里添加start命令:
"scripts": { "start": "concurrently \"rails s\" \"bin/webpack-dev-server\"" }
步骤3:启动服务
现在只需要在终端执行这条命令,就能同时启动两个服务器:
yarn start
当你按下Ctrl+C时,concurrently会向Rails和Webpack的进程都发送终止信号,不会有任何残留进程占用端口。
备选方案:使用foreman(适合更复杂的进程管理)
如果你需要管理更多进程,或者习惯用Procfile配置,可以试试foreman:
- 安装foreman:
gem install foreman - 在项目根目录创建
Procfile文件,内容如下:
web: rails s webpack: bin/webpack-dev-server
- 启动服务:
foreman start
同样,按下Ctrl+C时,foreman会终止所有进程。
为什么直接用&会有问题?
当你用command &把进程放到后台时,这个进程会脱离当前终端的进程组,当你按下Ctrl+C发送SIGINT信号时,只有前台进程组里的进程会收到信号并终止,后台进程不会收到,所以就会残留下来占用端口。而concurrently或foreman会把所有子进程纳入同一个进程组,统一处理终止信号,避免了这个问题。
内容的提问来源于stack exchange,提问作者Benjamin Hargett
相关产品推荐
相关产品推荐

