我正在尝试使用计划的 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"