部署 怎样在启动脚本中使用 rvm 环境?

xdz0611 · 2014年03月21日 · 最后由 xdz0611 回复于 2014年06月14日 · 2875 次阅读

系统是 CentOS 6.4 线上的服务器是用 capistrano 来发布的,重启之后服务自然不会自己起启动。因此我想把启动脚本放到/etc/rc.loca 下面。 有个头疼的问题就是用了 rvm,又不想写死绝对路径,因此需要引入 rvm 环境才能找到 ruby 的路径。我尝试把 source /etc/bash.bashrc加到了/etc/rc.local。重启之后,发现thin的启动脚本报错,说没有设置ruby版本。^[[31mERROR: RVM Ruby not used, run rvm use 1.8 first.^[[0;10m 请问下,rvm 的初始化脚本是哪个呢?

一直没有理解,rvm 是怎么初始化的?在系统启动的时候,PATH 里面是没有 rvm 相关的路径的,它是通过哪里的启动来引入自己的初始化脚本呢?我看了下官方的文档,暂时还没有找到。看了下可能相关的是/etc/bash.bashrc 或者/etc/zprofile 或者/etc/rvmrc,但是不能确定。

xxx/.rvm/bin/rvm 1.8.7@mp exec bundle exec

这个问题也困扰我。 这是我目前仍然有效的设定, 若有更好的建议,也请提供。

在 rc.local 里: su USERNAME -c '/home/USERNAME/bin/start_PROJECT.sh'

start_PROJECT.sh:

#!/bin/sh
APP_ROOT="/home/SITES/PROJECT"
ENV=production
GEM_HOME="/home/USERNAME/.rvm/gems/ruby-1.9.3-p125"
THIN_OPTS="-C /home/SITES/PROJECT/config.yml -R /home/SITES/PROJECT/config.ru start"
SET_PATH="cd $APP_ROOT; /home/USERNAME/.rvm/bin/rvm use 1.9.3-p125; export GEM_HOME=$GEM_HOME"
CMD="$SET_PATH; $GEM_HOME/bin/thin $THIN_OPTS"
su - USERNAME -c "$CMD"

另外一种也有效的是: /etc/rc.local 同上, 但 start_PROJECT.sh 的内容是:

export LC_CTYPE=en_US.UTF-8
cd /home/USERNAME/RAILS/PROJECT
#/home/USERNAME/.rvm/bin/PROJECT-ror_thin start -d
/home/USERNAME/.rvm/bin/PROJECT-ror_thin start --socket=/tmp/PROJECT.sock -d

而 PROJECT-ror_thin 的内容为:

#!/usr/bin/env bash

if [[ -s "/home/USERNAME/.rvm/environments/ruby-1.9.3-p392" ]]
then
  source "/home/USERNAME/.rvm/environments/ruby-1.9.3-p392"
  exec thin "$@"
else
  echo "ERROR: Missing RVM environment file: '/home/USERNAME/.rvm/environments/ruby-1.9.3-p392'" >&2
  exit 1
fi

但 linux 系统从 init 换成 systemd 后,就有点问题。

自己回复一下。这个问题现在已经解决了。只需要在执行 ruby 命令前,先引入 rvm 环境即可。 具体在 centos 下是/etc/profile.d/rvm.sh 这个脚本。 i.e.

#!/bin/bash source /etc/profile.d/rvm.sh bla bla....

需要 登录 后方可回复, 如果你还没有账号请 注册新账号