Ruby脚本在cron运行时抛出错误,但在用户运行时不会

Posted

技术标签:

【中文标题】Ruby脚本在cron运行时抛出错误,但在用户运行时不会【英文标题】:Ruby script throws error when run by cron, but not when run by user 【发布时间】: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 【参考方案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

【讨论】:

以上是关于Ruby脚本在cron运行时抛出错误,但在用户运行时不会的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式模式选择正确的子字符串,但在运行宏 vba 时抛出错误

Scrapy 使用 crawlerprocess 运行时抛出错误

Spark Shell 导入正常,但在引用类时抛出错误

当我运行测试用例时,实体管理器已成功注入,但在运行 Web 应用程序时抛出 NullPointerException

Spring Boot 构建良好,但在运行时抛出 javax.naming.NameNotFoundException: remaining name: env/jmx/runtime

Unity 在为 Android 构建时在运行时抛出 IL2CPP 构建错误? 2018.4.5f1