以其他使用者(非 root)身分執行 ruby​​ 應用程式的啟動 shell 腳本

以其他使用者(非 root)身分執行 ruby​​ 應用程式的啟動 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(在exit 0之前新增)

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

使用上述更改後,我的 Rails 應用程式無法啟動。我可以確認這一點,因為沒有活動的 GNU 螢幕會話( screen -d -m mongrel_rails... 命令啟動螢幕會話並分離。我應該能夠使用“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' 進入此帳戶時,user01 的 ruby​​ 被破壞了。 「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

如果「/var/script/start.sh」在您以 user01 身分登入執行時有效,則您的腳本取決於環境變數。要查看這些變量,請執行“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,清除環境變數並初始化所有其他內容,如手冊頁所述。

相關內容