5

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

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

这该怎么做。谢谢。

4

3 回答 3

19

我将把它留在这里,因为我认为它很有用:

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
于 2012-02-03T16:43:44.777 回答
3

您可以为此使用锁定文件。任务运行时,尝试获取锁,如果获得锁则运行 rake 任务。如果你没有得到锁,那么就不要运行 rake;您可能还想在某处记录错误或警告,或者您的 rake 任务可能会在您知道之前几周或几个月内没有做任何事情。当 rake 退出时,解锁锁定文件。

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

您也可以使用 PID 文件。您将在某处拥有一个包含 rake 进程进程 ID 的文件。在启动 rake 之前,您从该文件中读取 PID 并查看进程是否正在运行;如果不是,则启动 rake 并将其 PID 写入 PID 文件。当 rake 存在时,删除 PID 文件。如果您想非常严格,您可能希望将此与锁定 PID 文件结合起来,但这取决于您的具体情况。

于 2010-10-21T05:05:46.543 回答
1

您只需要一个名为pidfile的 gem 。

将此添加到您的 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
于 2016-12-01T08:04:30.400 回答