【问题标题】:Ruby script throws error when run by cron, but not when run by userRuby脚本在cron运行时抛出错误,但在用户运行时不会
【发布时间】:2014-07-09 02:58:41
【问题描述】:

我有一个 ruby​​ 脚本,它抓取 Twitter 帐户,输出到 CSV,加载/清理 CSV,并通过 MarkyMarkov 运行它以生成 @ebooks 风格的推文。

当我从命令行手动运行该脚本时,该脚本在我的服务器上完美运行,但是当我通过 cron 运行它时,它会生成以下错误:

usr/share/ruby/csv.rb:2058:in `=~': invalid byte sequence in US-ASCII (ArgumentError)
from /usr/share/ruby/csv.rb:2058:in `init_separators'
from /usr/share/ruby/csv.rb:1590:in `initialize'
from /usr/share/ruby/csv.rb:1376:in `new'
from /usr/share/ruby/csv.rb:1376:in `parse'
from script.rb:57:in `<main>'

不知道为什么我运行它和 cron 的结果会有所不同。关于什么是错误的或如何进行调试的任何建议? Ruby 菜鸟在这里。

【问题讨论】:

  • 听起来好像cron运行的ruby版本比较老(pre-2.0),默认编码是US-ASCII,用户ruby比较新,默认编码是UTF- 8

标签: ruby csv twitter cron


【解决方案1】:

您可能正在使用 rbenv 或 RVM 来管理您的 rubies,它们会从配置文件脚本加载 Ruby 引用,而 cron 不会加载此类配置文件(例如,~/.bashrc)。

你应该可以做到:

0 * * * * /bin/bash -l -c '/path/to/your/script.rb'

这应该会加载您的用户环境并正确运行您的脚本。

另外,我不知道你是否熟悉它,这对你的情况来说可能有点矫枉过正,但 Whenever gem 提供了一个很好的 DSL 来处理 cron 作业。

【讨论】:

    【解决方案2】:

    我知道这是一个旧线程,但我遇到了类似的问题并想了解发生了什么。

    在我的例子中,我在脚本周围使用了一个 rvm 包装器,它应该足以提供必要的环境。尽管如此,我还是遇到了编码问题。我发现语言环境是瓶颈。提供适当的语言环境就足以解决这个问题

    0 * * * *  LC_ALL=en_US.UTF-8 /software/rvm/wrappers/ruby-2.4.2@watcher/ruby /path/to/my/script.rb
    

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 2017-02-05
      • 2015-05-15
      • 2016-12-03
      • 2011-08-03
      • 2016-12-18
      • 2019-12-24
      • 2017-03-28
      相关资源
      最近更新 更多