如何确保rake任务一次只运行一个进程

时间:2010-10-21 02:34:17

标签: ruby linux rake rake-task

我使用crontab在某个时间调用rake任务,例如:每3小时

我想确保当crontab准备好执行rake任务时 它可以检查rake任务是否正在运行。如果它是这样不执行。

如何做到这一点。感谢。

3 个答案:

答案 0 :(得分:18)

我会留在这里,因为我觉得它很有用:

task :my_task do
    pid_file = '/tmp/my_task.pid'
    raise 'pid file exists!' if File.exists? pid_file
    File.open(pid_file, 'w'){|f| f.puts Process.pid}
    begin
        # execute code here
    ensure
        File.delete pid_file
    end
end

答案 1 :(得分:3)

您可以使用锁定文件。任务运行时,如果获得锁定,请尝试抓住锁并运行rake任务。如果你没有锁,那就不要跑耙;你可能也想在某个地方记录错误或警告,或者在你知道它之前,你最终可能会在几周或几个月内没有做任何事情。当rake退出时,解锁锁定文件。

RAA这样的东西可能会有所帮助,但我没有使用它,所以也许没有。

您也可以使用PID文件。你有一个文件存放rake进程进程ID。在开始rake之前,您从该文件中读取PID并查看进程是否正在运行;如果不是那么启动rake并将其PID写入PID文件。当rake存在时,删除PID文件。如果您想要非常严格,那么您希望将其与PID文件上的锁定相结合,但这取决于您的具体情况。

答案 2 :(得分:1)

您需要的只是名为pidfile的宝石。

将此添加到您的Gemfile:

gem 'pidfile', '>= 0.3.0'

任务可能是:

desc "my task"
task :my_task do |t|
  PidFile.new(piddir: "/var/lock", pidfile: "#{t.name}.pid")
  # do something
end