我已经在 Ubuntu 14.04 上使用“user01”安装了 RVM,并且 user01 可以按预期启动我的 rails 应用程序。但是,我想在系统启动后启动此应用程序。我尝试使用以下方法来实现此目的:
/var/脚本/start.sh
screen -d -m mongrel_rails start -e production -p 8088
/etc/rc.local(在出口 0 之前添加)
sh './var/script/start.sh'
使用上述更改后,我的 rails 应用程序无法启动。我可以确认这一点,因为没有活动的 GNU screen 会话(screen -d -m mongrel_rails... 命令启动 screen 会话并断开连接。我应该能够使用“screen -ls”命令查看该会话,但我看不到,即使切换到 root 后也是如此)。
我切换到 root(sudo su)并尝试手动启动该应用程序,但失败并显示以下信息:
/usr/bin/env:ruby:没有此文件或目录
我认为 RVM/Ruby 对 root 不起作用。我通过运行“ruby -v”确认了这一点,它返回一条消息,确认该应用程序未安装。但 user01 的情况并非如此,他可以看到有关已安装的 ruby 版本的信息。
我继续寻找解决这个问题的方法,并发现这个帖子建议在执行启动命令时使用以下命令切换到用户。
su user01 -c '/var/script/start.sh'
这也没有帮助,经过调查,我发现当我从 root 以“su user01”进入该帐户时,ruby 对 user01 不起作用。“ruby -v”也未能返回预期的信息。手动测试后,我发现输入“exit”会将我返回到 root,而另一个“exit”会将我返回到 user01(我用来登录的帐户),并且 ruby 可以正常用于此帐户。
有人能建议一种解决这个问题的方法吗?
答案1
您正在使用虚拟机,因此处理 ruby 未找到的正确方法是使用 rvm 包装器(在 SysVinit 和 upstart 系统上)。
首先(可选)为您的应用创建您想要使用的 gemset 的别名:
rvm alias create my_app ruby-2.1.4@my_gemset
然后创建您想要的包装器:
rvm wrapper my_app mongrel_rails
包装器在目录中创建$rvm_path/wrappers/my_app
,然后您在切换用户后从初始化脚本中调用它。
su user01 -c '/home/user01/.rvm/wrappers/my_app/mongrel_rails -e production -p 8088'
(请注意,我已完全删除screen
它,因为没有什么理由在屏幕内运行它。)
答案2
如果以 user01 身份登录运行“/var/script/start.sh”时,该脚本有效,则说明脚本依赖于环境变量。要查看这些变量,请运行“env”。当您尝试通过“su user01 -c”从 root 帐户运行该脚本时,可能缺少某些内容。
我建议尝试在 su 中使用特殊选项 '-'。摘自手册页:
-, -l, --login
make the shell a login shell, clears all envvars except
for TERM, initializes HOME, SHELL, USER, LOGNAME and PATH
因此你的命令看起来应该是这样的:
# su - user01 -c '/var/script/start.sh'
这样,user01 将使 shell 成为登录 shell,清除环境变量并初始化所有其他内容,如手册页所述。