2014-10-05 97 views
0

我有一個Rails跑步任務,我想從cron運行,但當然cron作爲root運行,所以環境設置不當以使RVM正常工作。我已經嘗試了一些東西,迄今爲止還沒有工作。 crontab條目是:從Cron運行Rails任務

* 0 * * * root cd /home/deploy/rails_apps/supercharger/current/ && /usr/local/rvm/wrappers/ruby-1.9.3-p484/ruby bundle exec rails runner -e production "Charger.start" 

超長命令行的道歉。不管怎麼說,我得到的錯誤是:

ruby: No such file or directory -- bundle (LoadError) 

因此,在RVM目錄中找到ruby,但環境是錯誤的。

我試過rvm alias delete [alias_name],它似乎做了一些事情,但是如果我知道它生成的包裝器在哪裏,它會變得麻煩。我看着/usr/local/rvm/wrappers,並沒有看到一個我指定的名字。

這似乎是一個常見問題 - 常見的問題是存在whenever寶石。我使用的亞軍命令是如此簡單,它似乎只是將這個條目放在crontab中,而不是那麼多的扣籃......

任何與此有關的幫助表示讚賞。

回答

1

這聽起來像您可以使用第三方工具繫繩你的Rails應用的cron:Whenever。你已經知道它,但似乎你從來沒有嘗試過。這個gem包括一個簡單的DSL,可以在你的情況一樣適用:

every :day # Or specify another period, or something else, see README 
    runner "Charger.start" 
end 

一旦你定義你的時間表,你需要將它寫入與whenever命令行實用crontab中。有關詳細信息,請參見README filewhenever --help

它不應該在運行時造成任何性能影響,因爲它在完成部署或顯式命令後所做的只是轉換爲crontab格式。這是不需要的,一旦服務器正在運行,所有事情都在cron之後完成。

如果您不想額外使用寶石,那麼您不妨檢查執行任務時發出的命令。不過,添加cron任務的自動方式更易於維護和部署。當然,只要給crontab扔一條線就更簡單了,只需要一次。然後,它開始變得重複和累人,更不用說其他潛在開發者的困惑,他們必須在自己的機器上設置類似的東西。

+0

爲了加速這個過程,我使用'when'和'deploy'部署後,ssh進入服務器並運行'when'命令。我複製並粘貼到我的crontab中。在某些時候,我可能希望將其納入我的部署中,但不是現在......一旦作業可靠運行,那麼額外的自動化步驟。謝謝! – 2014-10-05 22:09:49

1

您可以作爲不同於root的用戶運行cron。即使在你的例子中,任務開始於

* 0 * * * root cd 

root是運行命令的用戶。您可以使用crontab -e -u username進行編輯。

如果您堅持以超級用戶身份運行cron任務或因其他用戶因某種原因無法正常工作而運行,則可以使用su切換用戶。例如:

su - username -c "bundle exec rails runner -e production "Charger.start" 
+0

我曾嘗試'0 * 0 0 0 0部署big_long_command_string',但未能尊重RVM設置。我可能錯過了一些魔法。我相信「每當」可能是一個便宜的解決方案,但它顯然不能掩蓋我在這種情況下顯然有的個人盲點。 – 2014-10-05 22:12:29

+0

這就是爲什麼實際上第二種方法可能會更好。 Cron作業默認運行在'sh'中,而不是'bash',你可能沒有用'sh'配置RVM(我不知道它是否可能)。您可以嘗試將shell更改爲'bash'(請參閱http://unix.stackexchange.com/questions/94456/how-to-change-cron-shell-sh-to-bash),但您可能需要手動獲取某些文件,如'.bash_profile'或者配置了RVM的任何地方。 – katafrakt 2014-10-06 06:28:44