以其他用户(不是root)的身份运行启动shell脚本,

我已经在Ubuntu 14.04上使用'user01'安装了RVM,并且user01可以按照预期启动我的rails应用程序。 然而,我想在系统启动后启动这个应用程序。 我正在尝试使用以下来实现这一点:

/var/script/start.sh

screen -d -m mongrel_rails start -e production -p 8088 

/etc/rc.local (在退出0之前添加)

 sh './var/script/start.sh' 

使用上面的更改,我的rails应用程序无法启动。 我可以证实这一点,因为没有活动的GNU屏幕会话(屏幕-d -m mongrel_rails …命令启动屏幕会话并分离,我应该能够看到与“screen -ls”命令的会话,但我不要,甚至切换到根后)。

我切换到根(sudo su),并尝试手动启动应用程序,但失败,如下所示:

/ usr / bin / env:ruby:没有这样的文件或目录

我认为RVM / Ruby已经被破坏了。 我通过运行'ruby -v'确认了这一点,它返回了一条确认应用程序未安装的消息。 看到有关安装的ruby版本的信息的user01不是这种情况。

我继续find一个解决办法,发现这个post ,build议在执行启动命令时切换到用户以下命令。

 su user01 -c '/var/script/start.sh' 

这也没有帮助,经过调查,我发现,当我su'user01'从root的ruby被打破了user01。 'ruby -v'也没有返回预期的信息。 手动testing后,我发现input“退出”返回到我的根,另一个“退出”返回到我的帐户user01(我用来login的帐户)和ruby正常工作。

任何人都可以提出一个方法来解决这个问题?

你正在使用rvm ,所以正确的方式来处理ruby没有被发现是使用rvm包装 (在SysVinit和新贵系统)。

首先(可选)为要使用的gemset创build应用的别名:

 rvm alias create my_app ruby-2.1.4@my_gemset 

然后创build你想要的包装器:

 rvm wrapper my_app mongrel_rails 

包装器是在$rvm_path/wrappers/my_app目录中创build的,然后在切换用户之后从init脚本中调用它。

 su user01 -c '/home/user01/.rvm/wrappers/my_app/mongrel_rails -e production -p 8088' 

(请注意,我已经完全从screen移除了screen ,因为在屏幕内运行这个屏幕没有多less理由。)

如果'/var/script/start.sh'在运行时以user01的身份login,那么脚本依赖于环境variables。 要查看运行“env”的variables。 当您尝试通过“su user01 -c”从root帐户运行它时,可能会丢失一些东西。

我会build议尝试使用一个特殊的选项“ – ”与苏。 从手册页:

  -, -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成为loginshell,清除envvars并初始化所有其他的东西,如手册页所述。