Capistrano rbenv部署卡住无输出,--trace停在rbenv:validate步骤
嘿,我之前也碰到过Capistrano在rbenv验证环节卡壳的情况,结合你给出的信息,咱们一步步来排查解决:
问题梳理
- 复现步骤:执行
cap production deploy,命令直接卡住,只能手动终止 - 预期行为:部署流程应继续执行,超时后输出错误日志或相关提示
- 实际行为:
- 执行
cap production deploy无任何输出,持续处于等待状态 - 执行
cap production deploy --trace时,输出停在这一步:** Invoke production (first_time) ** Execute production ** Invoke load:defaults (first_time) ** Execute load:defaults ** Invoke rbenv:validate (first_time) ** Execute rbenv:validate
- 执行
排查与解决思路
1. 先排查SSH连接与远程权限问题
Capistrano在rbenv:validate阶段会远程执行rbenv相关命令,卡住大概率是SSH或权限出了问题:
- 手动测试SSH免密登录生产服务器,确保能顺畅连接,然后执行
rbenv version、rbenv which ruby这类命令,看是否能快速返回结果,没有卡顿 - 确认部署用户对rbenv安装目录(一般是
~/.rbenv)和项目目录有完整的读写权限
2. 开启更详细的日志输出
除了--trace,可以用-vvv参数获取Capistrano的详细执行日志,能看到远程执行的具体命令,帮你定位卡壳的具体环节:
cap production deploy -vvv
3. 检查rbenv及插件版本
老旧的rbenv或ruby-build插件可能导致命令执行缓慢甚至卡住,建议在服务器上更新一下:
# 更新rbenv cd ~/.rbenv git pull # 更新ruby-build插件 cd ~/.rbenv/plugins/ruby-build git pull
同时确认服务器上.ruby-version指定的Ruby版本确实已通过rbenv安装,不存在版本缺失或软链接异常的情况。
4. 调整Capistrano的超时配置
如果是远程命令执行超时但Capistrano没触发提示,可以在config/deploy.rb里添加超时设置,让它到点就抛出错误:
set :ssh_options, { forward_agent: true, timeout: 30 # 可根据实际情况调整为30或60秒 }
5. 手动模拟rbenv验证命令
Capistrano的rbenv:validate本质是远程执行版本检查命令,你可以手动在本地模拟执行,看是否会卡住:
ssh 你的部署用户@生产服务器地址 "rbenv versions | grep $(cat .ruby-version)"
如果这个命令卡住,那问题就出在服务器端的rbenv配置上,比如指定的Ruby版本不存在,或者rbenv加载流程有问题。
内容的提问来源于stack exchange,提问作者Anyelo Petit
相关产品推荐
相关产品推荐

