使用Bullet Train框架时,bin/dev按Ctrl+C后自动重启的问题排查
问题原因及解决办法
可能的原因
- Foreman进程管理器的默认重启机制:
bin/dev底层依赖Foreman管理Procfile中的所有进程,默认逻辑下,如果某个进程未正常退出(比如Ctrl+C触发的中断信号没被进程正确处理),Foreman会自动重启该进程,直到收到第二次中断信号才会终止所有进程。 - Yarn Watch进程的信号处理异常:带
--watch的Yarn构建命令(如yarn build --watch)可能未正确响应SIGINT中断信号,导致进程被强制杀死而非正常退出,Foreman会判定为进程崩溃,进而触发自动重启。
解决办法
- 禁用Foreman的自动重启
修改bin/dev脚本里的Foreman启动命令,添加--no-restart参数:
# 原bin/dev中的命令通常为 foreman start -f Procfile.dev # 修改为 foreman start -f Procfile.dev --no-restart
这样所有进程退出后不会被自动重启,一次Ctrl+C就能终止全部进程。
- 修复Yarn Watch进程的信号响应
单独测试某个带--watch的Yarn命令,比如运行yarn build --watch,按Ctrl+C观察是否能正常退出。如果不能,尝试添加参数让它正确处理信号:
- 若使用Webpack,可添加
--no-stdin:js: yarn build --watch --no-stdin - 若使用Vite,确保使用最新版本,或尝试添加
--force-exit参数(部分版本支持)。
- 调整Sidekiq的退出超时
Sidekiq的-t 25参数设置了作业超时25秒,退出时可能需要等待正在运行的作业完成,导致Foreman误判进程异常。可以尝试调整超时时间,或添加--stop-timeout参数让Sidekiq更快退出:
worker: bundle exec sidekiq -t 25 --stop-timeout 5
内容的提问来源于stack exchange,提问作者Lomefin
相关产品推荐
相关产品推荐

