【问题标题】:Limit instances of rake task限制 rake 任务的实例
【发布时间】:2010-07-21 20:39:27
【问题描述】:

有没有办法限制 rake 任务的实例数量?

我有一个 rake 任务,用于阅读作为 cron 作业每 5 分钟运行一次的电子邮件。

有时 rake 任务需要超过 5 分钟才能完成,而另一个 rake 任务在完成之前启动。

有一些 hacky 变通方法可以检查 rake 文件中的 ps -Af,但我 我正在寻找更简洁的方法来限制启动多个实例 rake 任务类似于 daemon gem 的工作方式。

检查电子邮件只是一个例子,我有几个这样的 rake 任务涉及 轮询多个服务器。

【问题讨论】:

  • 一种检查特定 rake 任务是否正在运行的优雅方法也是一种可接受的解决方案。

标签: ruby-on-rails ruby rake


【解决方案1】:

您也可以只使用 PidFile。

首先,安装“pidfile”gem。然后让你的任务是这样的:

task :my_task => :environment do |task|
    PidFile.new(:piddir => Rails.root.join('tmp', 'pids'), :pidfile => task.name)

    # do some stuff
end

【讨论】:

    【解决方案2】:

    仍然找不到超级优雅的方式,所以我求助于保存一个独特的文件 每个 rake 任务。

    这就是 rake 任务现在的样子 -

    run_unique_rake(__FILE__) 做 puts "\n 正在运行\n" 睡觉(40) 结尾

    这里是 run_unique_rake

    def self.run_unique_rake(文件) 路径 = RAILS_ROOT + "/" + CONFIG['rake_log'] + "/" + File.basename(file) 除非 File.exists?(路径) `触摸#{路径}` 如果 block_given 产生? `rm #{路径}` 结尾 结尾

    仍然希望在 rake 中找到一种优雅的方式来限制单个实例。

    【讨论】:

    • 您的方法很好,尽管您在测试存在和进行“触摸”之间存在竞争条件。通过 File.open(path, File::CREAT|File::EXCL) {} 来解决这个问题。该文件将被创建,除非它已经存在,在这种情况下将引发 EEXIST。另外,不要使用反引号 rm,而是使用: File.unlink(path) 这将更有效;并将取消链接放在“确保”之后(开始;产量;确保;File.unlink(path);结束)
    • 谢谢!就我而言,cron 作业每小时运行一次,因此不太可能出现竞争条件。我一定会采纳有关使用 File 对象和添加确保案例的好建议。
    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2010-10-09
    • 2017-10-04
    相关资源
    最近更新 更多