【问题标题】:How to make whenever skip files in progress每当跳过正在进行的文件时如何制作
【发布时间】:2013-11-26 22:50:46
【问题描述】:

每当我们管理大量导入作业时,我们都会使用 Ruby gem。但是,如果下一个 cron 作业发生时仍在导入文件怎么办?

例如:

12am:每当启动 import.csv 的导入 cron 作业时

凌晨 2 点:import.csv 仍在导入中,但下一个 cron 作业已安排在任何时间。

是否会跳过该文件或尝试再次运行它?有什么建议可以确保它不会尝试两次处理同一个文件?

【问题讨论】:

  • 使用不同的文件名,例如基于时间戳的名称:import-yyyy-mm-dd-hh-mm-ss.csv。如果您的导入仍在运行,那么谁在乎,文件名将是唯一的。当长时间运行的文件完成后,您会查看是否有任何其他文件可用并开始处理这些文件。
  • 保存记录哪些文件已排队、正在运行和已完成。
  • 简单地为文件使用不同的名称并不是一个好的解决方案。如果应用程序由于某种原因运行缓慢或停止,那么后续作业可能会因为同样的原因运行缓慢或停止,这会级联直到机器阻塞。相反,代码本身必须感知其他实例是否正在运行并退出并通知某人。如果作业没有按时完成,应该有一个已知的原因,应该对其进行分析,然后写入代码。

标签: ruby cron whenever


【解决方案1】:

Whenever 只是 crontab 的前端。每当实际上没有启动任何进程时,它都会编写一个 crontab 来处理实际的调度和启动。无论何时都无法完成您的要求。

crontab 也不能做你想做的事。它启动进程,就是这样。

您需要在 cron 启动的进程中自己实现检查。执行此操作的常见方法可能是锁定文件,我确信有用于此的库(即http://rubygems.org/gems/lockfile)。

根据您的情况,您可以在启动导入之前创建其他检查。

【讨论】:

  • 谢谢,@Jakob-S。 Lockfile 正是我们缺少的步骤。
【解决方案2】:

嗯,这不是什么时候的问题

但是,您可以在开始处理时重命名要导入的文件(凌晨 12 点到凌晨 2 点是一个合理的时间),并在完成处理后将其移至存档目录,以免造成混淆。

下次任务运行时,它应该查找所有与命名模式不匹配的文件(正如其中一个 cmets 中已建议的那样)

并且您可能想要添加一个额外的任务来检查可能失败的导入(例如,一个文件的命名模式包括确切的时间,但一整天后它仍然没有存档)并创建某种通知或者只是再次触发任务/重命名任务以便再次拾取它(取决于您的回滚工作情况)

【讨论】:

    猜你喜欢
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多