我正在嘗試使用計劃的 cronjob 運行 rake 任務。我的 crontab 看起來像這樣:
0 1 * * 1-7 /bin/bash -l -c "cd ~/jobs/rake && rake reports:create >> ~/jobs/logs/cron.log"
我帳戶上的 Ruby 由 RVM 提供,透過以下方式載入~/.bashrc
(在無互動檢查之前):
# load RVM env
[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
# ... rest of logic
一次又一次,該任務無法運行,因為呼叫該任務時未載入 RVM(/usr/bin/ruby
而是使用系統的),並且缺少 gem 依賴項。
如何讓 crontab 在執行排程作業之前載入我的 shell 環境?謝謝。
答案1
簡單地在 cronjob 中獲取 ~/.bashrc 不就可以了嗎?
0 1 * * 1-7 /bin/bash -l -c "source ~/.bashrc; cd ~/jobs/rake && rake reports:create >> ~/jobs/logs/cron.log"
答案2
不建議在背景進程中使用登入 shell。
你可以使用這個方法:
0 1 * * 1-7 ~/.rvm/bin/rvm in ~/jobs/rake do rake reports:create >> ~/jobs/logs/cron.log"
還有rvm cron
命令:
rvm help cron
答案3
經過對 @mpapis 的回覆進行一番挖掘後,RVM 網站上似乎有一個頁面詳細說明如何在 cron 執行的腳本中使用特定的 RVM 安裝。
基本上,您可以透過執行此命令來找出您想要使用的 RVM(此處使用 ruby 1.9.3):
$ rvm env --path -- 1.9.3-p125
替換您特定的 ruby 版本。這將指向需要編輯的文件,source
以便載入所需的 ruby 環境。
編寫要由 cron 作業執行的腳本:
我的工作
#!/bin/bash
# the full path to the RVM env you got from running `rvm env ...`
source ~/.rvm/environments/ruby-1.9.3-p125
# do stuff ...
cd ~/jobs/rake
rake reports:create
確保使文件可執行:
chmod u+x myjob.sh
定時任務
0 1 * * 1-7 bash -c "cd ~/jobs && ./myjob.sh"