编辑:我刚刚注意到用户回答了他自己的帖子,但我会留下这个,以防有人在这里遇到类似问题。我发现它对某些人有帮助。
我遇到过这个问题,发现这是 Ruby 脚本的解决方案。
Ruby 需要在特定环境中执行。 RVM 通过为您的特定版本的 ruby 提供一个 ruby 环境文件来处理这个问题,该文件设置了所有必需的环境变量。例如,如果您有 ruby 1.9.3 补丁 448,您可以查看来源的环境文件:
cat /usr/local/rvm/environments/ruby-1.9.3-p484
export PATH="/usr/local/rvm/gems/ruby-1.9.3-p484/bin:/usr/local/rvm/gems/ruby-1.9.3-p484@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p484/bin:$PATH"
export GEM_HOME='/usr/local/rvm/gems/ruby-1.9.3-p484'
export GEM_PATH='/usr/local/rvm/gems/ruby-1.9.3-p484:/usr/local/rvm/gems/ruby-1.9.3-p484@global'
export IRBRC='/usr/local/rvm/rubies/ruby-1.9.3-p484/.irbrc'
unset MAGLEV_HOME
unset RBXOPT
(注意:我的 rvm 安装在 /usr/local/.. 下,但您的可能在其他地方。使用 which ruby 找出您的 ruby 的安装位置)
在这里您可以看到它正在设置PATH 和其他一些重要的环境变量。当您键入rvm use ruby-1.9.3-p448 时,rvm 实际上会在后台获取此文件。
Cron 执行是非交互式会话,这意味着它们在会话前没有“实时”用户登录。当您手动执行此操作并运行交互式会话时,所有这些都会为您处理好,但对于非交互式会话,它不知道 shell 是什么或在哪里找到环境路径。也许有更多知识的人可以就原因提供技术解释。
无论如何,要解决这个问题,请将其添加到 crontab 的顶部:
SHELL=/bin/bash
BASH_ENV=/home/gigawatt/.bashrc
* * * * * /home/gigawatt/.rvm/rubies/ruby-2.0.0-p247/bin/ruby /home/gigawatt/drbronnersbot/drbronnersbot.rb
这是告诉非交互式 cron 用户使用哪个 shell,然后告诉它获取 .bashrc 文件。 .bashrc 文件中有什么内容?好问题,你应该添加这一行 -
source /usr/local/rvm/environments/ruby-1.9.3-p484
(再一次,用你自己的 ruby 路径替换)
基本上,您是手动获取 rvm 为您获取的环境文件。这是一种让 cron 使用特定 gem 环境或 gemset 的方法。
它应该适用于这两个更改。
Edit2:在 Ubuntu 和类似系统上,默认的 .bashrc 通常包含类似
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
正如评论所暗示的,文件不会在非交互式/cron 会话中运行。您在该行下添加的任何内容都不会被执行。
在这种情况下,要么将您的 source 命令放在该行上方,要么一起使用不同的文件,例如 ~/.cronrc。