crontab 没有运行 ruby​​ 脚本

Posted

技术标签:

【中文标题】crontab 没有运行 ruby​​ 脚本【英文标题】:Crontab not running ruby script 【发布时间】:2013-12-20 10:17:50 【问题描述】:

下面的 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)"

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

【问题讨论】:

如果您使用的是 rvm,您可能需要使用 rvm cron setup 引导您的 crontab /home/gigawatt/.rvm/rubies/ruby-2.0.0-p247/bin/ruby 也在我的 ruby​​ 文件的顶部#!/home/gigawatt/.rvm/rubies/ruby-2.0.0-p247/bin/ruby 【参考方案1】:

编辑:我刚刚注意到用户回答了他自己的帖子,但我会留下这个,以防有人在这里遇到类似问题。我发现它对某些人有帮助。

我遇到过这个问题,发现这是 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

【讨论】:

【参考方案2】:

我已经让它工作了

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

【讨论】:

任何人看,这是最简单的方法。 对我不起作用,我在 cron 和我的脚本中使用完整路径【参考方案3】:

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

运行此命令,将 2.5.1 替换为您的 ruby​​ 版本

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】:

解决了,我在代码中调用了两个文件,但它找不到这些文件。我编辑 .rb 文件以包含完整路径,它现在可以完美运行。谢谢大家!

【讨论】:

【参考方案5】:

你试过了吗:

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

【讨论】:

尝试使用上面的完整 RVM 路径,你没有说你使用的是 rvm。 不是同样的问题Dec 4 12:58:01 dahlia /USR/SBIN/CRON[16513]: (gigawatt) CMD (/home/gigawatt/.rvm/rubies/ruby-2.0.0-p247/bin/ruby /home/gigawatt/drbronnersbot/drbronnersbot.rb) Dec 4 12:58:01 dahlia /USR/SBIN/CRON[16512]: (CRON) error (grandchild #16513 failed with exit status 1) 如果您将其粘贴到拥有该 crontab 的同一用户的终端中,它是否有效?

以上是关于crontab 没有运行 ruby​​ 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个 cron 作业来运行 ruby​​ 脚本?

crontab 没有运行我的脚本

尽管脚本在手动运行时有效,但 Crontab 没有在 macOS 中运行我的 python 脚本

在没有 CronTab 的情况下运行 Perl 脚本 1 分钟间隔

crontab 没有运行 local/bin/ 脚本。大苏尔卡塔利娜

如何使用 crontab 运行运行 Python 脚本的 Bash 脚本