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 运行时抛出错误
当我运行测试用例时,实体管理器已成功注入,但在运行 Web 应用程序时抛出 NullPointerException
Spring Boot 构建良好,但在运行时抛出 javax.naming.NameNotFoundException: remaining name: env/jmx/runtime