Crontab没有运行ruby脚本

时间:2013-12-04 04:14:57

标签: ruby crontab

下面的crontab -l似乎没有运行。手动运行的脚本运行正常。这是我看到的错误

Dec  3 20:12:01 dahlia /USR/SBIN/CRON[13912]: (gigawatt) CMD (/bin/sh -c "(export   PATH=/usr/bin:/bin; /home/gigawatt/drbronnersbot/drbronnersbot.rb)")
Dec  3 20:12:01 dahlia /USR/SBIN/CRON[13910]: (CRON) error (grandchild #13912 failed with exit status 1)

这是crontab:

* * * * * /bin/sh -c "(export PATH=/usr/bin:/bin; /home/gigawatt/drbronnersbot/drbronnersbot.rb)"

权限是完全打开的,它的可执行文件,我把env路径放在文件的开头,仍然没有骰子。

5 个答案:

答案 0 :(得分:10)

修改:我刚刚注意到用户已经回复了他自己的帖子,但是如果有人在这里遇到类似的问题,我会留下这个帖子。我发现它对某些人有帮助。

我遇到过这个问题,发现这是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确定安装红宝石的位置

在这里,您可以看到它设置了PATH和其他一些重要的环境变量。当您键入rvm use ruby-1.9.3-p448时,rvm实际上在后台获取此文件。

Cron执行是非交互式会话,这意味着他们没有" live"用户在会话前登录。当您手动执行并运行交互式会话时,所有这些都将由您处理,但对于非交互式会话,它不知道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

(再次用你自己的红宝石路径替换) 基本上,您手动获取rvm为您提供的环境文件。这是让cron使用特定宝石环境或gemset的一种方式。

它应该适用于这两个变化。

Edit2 :在Ubuntu和类似系统上,默认.bashrc通常包含类似

的内容
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

正如评论所暗示的,文件在非交互式/ cron会话中不会运行。你在该行下添加的任何东西都不会被执行。

在这种情况下,要么将source命令放在该行上方,要么只使用不同的文件,例如~/.cronrc

答案 1 :(得分:9)

我已经使用

* * * * * /bin/bash -l -c 'ruby my-ruby-file.rb'

答案 2 :(得分:2)

解决了它,我在我的代码中调用了两个文件而无法找到这些文件。我编辑.rb文件以包含完整路径,它现在完美地工作。谢谢大家!

答案 3 :(得分:2)

这已经很老了,但我还是想发表评论。 RVM为您安装的每个版本的ruby创建一个包装。

运行此命令,将2.5.1替换为您的红宝石版本

rvm env --path 2.5.1

这为您提供了通往环境矿山的路径

/home/username/.rvm/environments/2.5.1

您只需要rvm路径

/home/username/.rvm/

看看wrappers目录,对于您安装的每个版本和gemset,应该都有一个包装。用包装器测试脚本

/home/username/.rvm/wrappers/ruby-2.5.1/ruby /home/username/scripts/script.rb

或者如果您有特定的宝石集

/home/username/.rvm/wrappers/ruby-2.5.1@gemset/ruby /home/username/scripts/script.rb

直接在您的crontab中使用此命令

* * * * * /home/username/.rvm/wrappers/ruby-2.5.1/ruby /home/username/scripts/script.rb

答案 4 :(得分:1)

你试过了吗?

* * * * * /home/gigawatt/.rvm/rubies/ruby-2.0.0-p247/bin/ruby /home/gigawatt/drbronnersbot/drbronnersbot.rb