Ruby on rails 限制rake任务的实例

Ruby on rails 限制rake任务的实例,ruby-on-rails,ruby,rake,Ruby On Rails,Ruby,Rake,有没有办法限制rake任务的实例数 我有一个rake任务,用于阅读作为cron作业每5分钟运行一次的电子邮件 有时,rake任务需要5分钟以上才能完成,有时需要另一个时间 rake任务在完成之前启动 在rake文件中有一些黑客的解决方法来检查ps-Af,但是我 我正在寻找更干净的方法来限制启动多个 rake任务类似于守护进程gem的工作方式 检查电子邮件只是一个例子,我有几个这样的任务涉及 轮询多个服务器 仍然找不到一个超级优雅的方法,所以我求助于为用户保存一个独特的文件 每个rake任务 这就

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

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

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

在rake文件中有一些黑客的解决方法来检查
ps-Af
,但是我 我正在寻找更干净的方法来限制启动多个 rake任务类似于守护进程gem的工作方式

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

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

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

run_unique_rake(__FILE__) do puts "\n is running\n" sleep(40) end 运行\u unique\u rake(\u文件\u)do 放置“\n正在运行\n” 睡眠(40) 结束 这里是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 def self.run_unique_rake(文件) path=RAILS\u ROOT+“/”+CONFIG['rake\u log']+“/”+File.basename(文件) 除非文件.exists?(路径) `触摸#{path}` 如果给定块_,收益率是多少? `rm#{path}` 结束 结束
仍然希望在rake中找到一种优雅的方式来限制单个实例。

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

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

run_unique_rake(__FILE__) do puts "\n is running\n" sleep(40) end 运行\u unique\u rake(\u文件\u)do 放置“\n正在运行\n” 睡眠(40) 结束 这里是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 def self.run_unique_rake(文件) path=RAILS\u ROOT+“/”+CONFIG['rake\u log']+“/”+File.basename(文件) 除非文件.exists?(路径) `触摸#{path}` 如果给定块_,收益率是多少? `rm#{path}` 结束 结束
仍然希望在rake中找到一种优雅的方式,将其限制为单个实例。

您也可以只使用一个PidFile

首先,安装“pidfile”gem。然后将您的任务设置为:

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

    # do some stuff
end

您也可以只使用一个PidFile

首先,安装“pidfile”gem。然后将您的任务设置为:

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

    # do some stuff
end

检查特定rake任务是否正在运行的优雅方法也是可接受的解决方案。检查特定rake任务是否正在运行的优雅方法也是可接受的解决方案。您的方法很好,尽管您在测试存在性和执行“触摸”之间存在竞争条件。通过执行File.open(路径,File::CREAT | File::exc){}来解决这个问题。将创建该文件,除非该文件已存在,在这种情况下将引发EEXIST。另外,使用:File.unlink(path)代替back-tick-rm,这将更有效率;并将取消链接放在“确保”后面(begin;yield;sure;File.unlink(path);end)谢谢!在我的例子中,cron作业每小时运行一次,因此不太可能出现竞争条件。我肯定会采纳关于使用文件对象和添加确保案例的建议。尽管在测试存在性和执行“触摸”之间存在竞争条件,但您的方法是很好的。通过执行File.open(路径,File::CREAT | File::exc){}来解决这个问题。将创建该文件,除非该文件已存在,在这种情况下将引发EEXIST。另外,使用:File.unlink(path)代替back-tick-rm,这将更有效率;并将取消链接放在“确保”后面(begin;yield;sure;File.unlink(path);end)谢谢!在我的例子中,cron作业每小时运行一次,因此不太可能出现竞争条件。我肯定会采纳关于使用File对象和添加一个sure case的好建议。