以其他用户(非 root)身份运行 ruby​​ 应用程序的启动 shell 脚本

以其他用户(非 root)身份运行 ruby​​ 应用程序的启动 shell 脚本

我已经在 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,清除环境变量并初始化所有其他内容,如手册页所述。

相关内容