限制 rake 任务的实例

发布于 2024-09-10 12:47:47 字数 293 浏览 0 评论 0原文

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

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

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

有一些 hacky 解决方法可以检查 rake 文件内的 ps -Af 但我 我正在寻找更清洁的方法来限制启动多个实例 rake 任务类似于守护进程 gem 的工作方式。

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

Is there a way to limit the number of instances of a rake task?

I have a rake task for reading emails that runs every 5 mins as a cron job.

Sometimes the rake tasks takes more than 5 mins to complete and another
rake task is launched before it finishes.

There are hacky workarounds to check ps -Af inside the rake file but I
am looking for cleaner way to limit launching multiple instances of the
rake tasks similar to how the daemon gem does.

Checking emails is just an example, I have several such rake tasks that involve
polling multiple servers.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

从此见与不见 2024-09-17 12:47:47

您也可以只使用 PidFile。

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

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

    # do some stuff
end

You could also just use a PidFile.

First, install the 'pidfile' gem. Then make your task like this:

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

    # do some stuff
end
樱娆 2024-09-17 12:47:47

仍然找不到超级优雅的方法,所以我诉诸于保存一个独特的文件
每个耙子任务。

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

run_unique_rake(__FILE__) do
     puts "\n is running\n"
     sleep(40)
end

这里是 run_unique_rake

def self.run_unique_rake(file)    
    path = RAILS_ROOT + "/" + CONFIG['rake_log'] + "/" + File.basename(file)

     unless File.exists?(path)
        `touch #{path}`
         yield if block_given?
         `rm #{path}`
     end
end

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

Still can't find a super elegant way, so I resorted to saving a unique file for
each rake task.

This is how the rake task looks now -

run_unique_rake(__FILE__) do
     puts "\n is running\n"
     sleep(40)
end

here is run_unique_rake

def self.run_unique_rake(file)    
    path = RAILS_ROOT + "/" + CONFIG['rake_log'] + "/" + File.basename(file)

     unless File.exists?(path)
        `touch #{path}`
         yield if block_given?
         `rm #{path}`
     end
end

Still hoping for an elegant way within rake to limit to a single instance.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文