在用户 cronjob 内加载登录 shell

在用户 cronjob 内加载登录 shell

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



砰!完成了。

相关内容