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 脚本的主要内容,如果未能解决你的问题,请参考以下文章
尽管脚本在手动运行时有效,但 Crontab 没有在 macOS 中运行我的 python 脚本
在没有 CronTab 的情况下运行 Perl 脚本 1 分钟间隔