【问题标题】:Ruby, random failures with File.newRuby,File.new 随机失败
【发布时间】:2013-01-04 05:57:03
【问题描述】:

我有一个运行良好的脚本,只是它随机生成新文件失败...

这是代码:

...
file_log_path = File.join(Rails.root, 'log', "xls_import_#{Time.now.to_i}.log")
@log = File.new(file_log_path, 'w+')
....

这是delayed_job.log中的错误

2012-12-21T18:18:41+0100: [Worker(delayed_job host:webserver2.netbanana.it pid:24482)] LoadDataFromCsv failed with Errno::ENOENT: No such file or directory - /var/www/rails/myapp/releases/20121210093945/log/xls_import_1356110321.log - 0 failed attempts
2012-12-21T18:18:41+0100: [Worker(delayed_job host:webserver2.netbanana.it pid:24482)] PERMANENTLY removing LoadDataFromCsv because of 1 consecutive failures.

其他时候,它有效!有人可以帮助我吗?

--编辑:

嗯...似乎 Rails.root 使用了错误的部署路径...实际上 /var/www/rails/myapp/releases/20121210093945 不存在。

但是,正如我所说,脚本有时有效,有时无效...如果我重新加载延迟作业,我的脚本会运行一些,然后开始失败。

【问题讨论】:

  • 部署应用后确定该路径存在吗?您可能缺少log 目录。
  • 好吧...delayed_job 似乎使用了错误的部署路径... /var/www/rails/myapp/releases/20121210093945 不存在。但是,正如我所说,脚本有时有效,有时无效……如果我重新加载延迟作业,我的脚本会运行一些,然后开始失败。
  • @MichDart 嗯,很明显,有时它不会。
  • 我修改了我上面的评论。
  • 你确定这不是某种竞争条件吗?您是否有不同的过程来读取和写入或创建这些日志? Time.now.to_i 使用 1 秒分辨率怎么样?你做某事的频率是否超过每秒一次?

标签: ruby delayed-job


【解决方案1】:

如果您使用 Capistrano 来管理您的发布,我猜这是基于路径结构的情况,那么您需要注意在部署发生后可以删除的引用路径。每次部署时都需要重新启动 DelayedJob,否则它可能在孤立目录中工作。

如果可能,您可能希望改用 shared/log 路径,因为这会在部署之间持续存在。

【讨论】:

  • 我正在使用 Capistrano,并且我知道每次部署后都会重新启动 delay_job。使用共享/日志是一个好主意,可能会解决我的问题......但我想了解为什么会发生这种情况。
  • 我正在使用 Capistrano,并且我知道每次部署后都会重新启动 delay_job。我已经使用共享/日志
  • 您可以在其中添加一些调试代码来抱怨存在或不存在的内容,甚至可以保存Dir.entries 列表的结果。如果您的部署目录消失,就会发生一些奇怪的事情。
  • 我发现了几个delayed_job 进程(僵尸),仍在运行...将它们全部杀死(不是metalica 的歌曲),现在它可以工作了!
【解决方案2】:

我发现了几个delayed_job 进程(僵尸),仍在运行...将它们全部杀死(不是metallica 的歌曲),现在它可以工作了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2017-02-07
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多